谁能告诉我为什么以下程序崩溃。
#include<stdio.h>
#include<string.h>
int main()
{
char **str;
strcpy(*str, "One");
puts(*str);
}
以及为什么以下程序没有。
#include<stdio.h>
#include<string.h>
int main()
{
char **str;
*str = "One";
puts(*str);
}
strcopy
假设您有可用的内存。
在第二个中,您指向*str
静态分配的“One”char[]
文字,该文字衰减为指针。这实际上也是未定义的,因为str
不是初始化,您仍在复制指向乱码的指针。
在第一个中,您尝试将字符串复制到*str
未初始化时指向的任何位置。这几乎肯定会使您的程序崩溃,因为它只是指向一些垃圾地址。
所以要正确地做到这一点
//allocate space for ARRAY_SIZE pointers
char **str = malloc(sizeof(char*) * ARRAY_SIZE);
*str = "One"; // assign the address of "One"
puts(*str); // print it.
...
free(str);
由于纯粹的运气,您的第二个不会崩溃。它应该是这样的:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char **str = malloc(sizeof *str);
if ( str != NULL ) {
*str = "One";
puts(*str);
free(str);
}
return 0;
}
或者:
#include<stdio.h>
#include<string.h>
int main()
{
char * str;
str = "One";
puts(str);
return 0;
}
在您编写它时,您正试图将字符串文字的地址填充"One"
到未分配的内存中,这会给您带来未定义的行为。
您的第一个崩溃出于同样的原因,您试图将字节、、、和复制'O'
到未分配的内存中。'n'
'e'
'\0'
第一个:
str 清除为 char**,但是您没有为此使用 memorey 分配!
记住,str是指向指针的指针,所以如果你想在str*中保留一个地址,你应该使用内存分配或在声明行中初始化!!
在您的代码中, str* 只是一个地址,而不是字符串!
第二个想法差不多。
在第一个程序中,您正在将字符串复制到非内存分配的指针。(*str) 没有 malloc、new 等。
在第二个中,您将字符串指针指向堆栈变量。str 指针仅在调用上下文期间有效,当函数退出时,str 指针将指向无效空间。因为这是 main(),所以你看不到