以下两个代码相似但第一个有结构,第二个没有。
为什么这段代码有效(没有警告)?
#include <stdio.h>
#include <string.h>
struct prova
{
char *stringa;
};
int main()
{
struct prova p;
strcpy (p.stringa, "example\0");
printf("%s\n", p.stringa);
return 0;
}
但以下代码不起作用?
Segmentation fault (core dumped)
有了这个警告:
code.c: In function ‘main’:
code.c:8:9: warning: ‘stringa’ is used uninitialized in this function [-Wuninitialized]
strcpy (stringa, "example\0");
#include <stdio.h>
#include <string.h>
int main()
{
char *stringa;
strcpy (stringa, "example\0");
printf("%s\n", stringa);
return 0;
}
谢谢!
答案 0 :(得分:4)
两者都不正确,因为您复制到未初始化变量指定的地址。因此,两个程序都会调用未定义的行为。
其中一个程序的工作原理归结为纯粹的机会。一种可能的未定义行为形式是您的程序正确运行。
您需要初始化指针以引用足够大小的内存块。例如:
char *stringa = malloc(8);
请注意,您不需要向字符串文字添加空终止符。这是隐含的。因此,根据这种内存分配,您可以编写:
strcpy(stringa, "example");
答案 1 :(得分:1)
您需要为字符串提供一些内存,以便将字符复制到。
使用malloc
除了第一个例子没有编译。
答案 2 :(得分:1)
写作时
struct prova { char * stringa; };
int main() { struct prova p;
strcpy (p.stringa, "example\0");
请注意p.stringa特别指向无处,但你复制到它。