【问题标题】:*char into main and *char into a struct*char 进入 main 和 *char 进入 struct
【发布时间】:2014-01-30 20:05:30
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 您没有为stringa 分配内存。它可能有效或无效,但仍然都是错误的。尝试在第一个示例中放置更大的字符串。
  • 是的,我知道这是错误的,但我不明白为什么第一个代码有效! (谢谢你的回答!)
  • 因为内存分配的内部机制。第一个示例可能比第二个示例分配更多的内存,或者以不同的方式。这是特定于编译器的,可能使用不同的编译器/平台会产生不同的结果。
  • 第一个代码有效!只是幸运。
  • @BLUEPIXY 我认为这段代码的任何版本都是不幸的。

标签: c string struct initialization strcpy


【解决方案1】:

您需要给字符串一些内存,以便将字符复制到。

使用malloc

除了第一个例子没有编译。

【讨论】:

    【解决方案2】:

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

    其中一个程序有效的事实归结为纯粹的机会。一种可能的未定义行为形式是您的程序运行正确。

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

    char *stringa = malloc(8);
    

    请注意,您不需要向字符串文字添加空终止符。那是隐含的。因此,鉴于此内存分配,您可以编写:

    strcpy(stringa, "example");
    

    【讨论】:

    • 好的,非常感谢!但是这个:char *stringa = malloc(10*sizeof(char)); 和这个是一样的:char stringa[10];?
    • @user 不,不是。前者分配的动态内存必须通过调用free 来释放以避免泄漏。后者自动分配存储空间,并且字符数组的生存时间与包含范围一样长。请注意,sizeof(char) 根据定义等于 1,因此惯用的 C 省略了它。如果你要自动分配,你会写char stringa[] = "example";
    • 如果事先我不知道我使用 malloc 的大小,但如果我知道大小,那么在(例如)char *stringa = malloc(10);char stringa[10]; 之间进行选择的原因是什么?
    • 如果你只知道运行时的长度,你必须使用malloc。生命周期问题也可能强制执行 malloc。
    • 只有在编译时知道 10 时才能使用 char s[10]。
    【解决方案3】:

    当你写作时

    结构证明 { 字符*字符串; };

    int main() { struct prova p;

    strcpy (p.stringa, "example\0");
    

    注意 p.stringa 没有特别指向任何地方,但你复制到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 2011-05-25
      • 1970-01-01
      • 2017-03-27
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多