以下两个代码相似,但第一个具有结构,第二个不具有。

为什么此代码有效(无警告)?

#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;
}

谢谢!

最佳答案

都不正确,因为您将复制到未初始化变量指定的地址。因此,这两个程序都调用 undefined 的行为。

程序之一有效的事实纯属偶然。 undefined 行为的一种可能形式是您的程序正确运行。

您需要初始化指针以引用足够大的内存块。例如:

char *stringa = malloc(8);

请注意,您不需要在字符串文字中添加空终止符。那是隐性的。因此,鉴于此内存分配,您可以编写:
strcpy(stringa, "example");

07-25 20:40