* char为main,* char为struct

时间:2014-01-11 21:39:20

标签: c string struct initialization strcpy

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

为什么这段代码有效(没有警告)?

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

谢谢!

3 个答案:

答案 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特别指向无处,但你复制到它。