任何人都可以告诉我为什么以下程序崩溃。
#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);
}
答案 0 :(得分:7)
strcopy
假设您有可用的内存。
在第二个中,您将*str
指向静态分配的“一个”char[]
字面值,该字面值会衰减为指针。这实际上也是未定义的,因为str
不是init'd你还在复制指向乱码的指针。
在第一个中,您尝试将字符串复制到*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);
答案 1 :(得分:2)
第一个:
str为char **,但是你没有使用memorey分配!
Remmber,str是指向指针的指针,所以如果你想在str *中保留地址,你应该在声明行中使用memorey allocation 或初始化!!
在你的代码中,str *只是一个地址,而不是一个字符串!
第二个是同样的想法。
答案 2 :(得分:2)
由于纯粹的运气,你的第二个不会崩溃。它应该是这样的:
#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'
复制到未分配的内存中。
答案 3 :(得分:0)
在第一个程序中,您正在对非内存分配指针执行字符串复制。 (* str)没有malloc,new等。
在第二个中,您将字符串指针指向堆栈变量。 str指针仅在调用的上下文中有效,并且当函数退出str指针时将指向无效空间。由于这是main(),你没有看到