0

我很想知道为什么下面的代码片段适用于某些 C 编译器而不是其他的。我的教授可以在 DevC++ 中编译此代码,我也可以,但我无法在 VS 2010 中编译此代码。有什么想法吗?VS 说 a.word 有一个错误的指针。我假设 VS 疯了,因为我没有初始化 a.word,但为什么代码在 DevC++ 中编译和工作?我必须添加 a.word=""; 在 strcpy 之前,然后它在 VS 中工作,但我再次很想知道为什么。谢谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct foo{  int num;
             char* word;
             struct foo *ptr;};
int main() {
        struct foo a;
        a.num = 5; a.ptr = &a;
        strcpy(a.word,"whichword");
}
4

1 回答 1

6

a.word是一个未初始化的指针 ( char*) 而不是未初始化的字符串 ( char[n])。这是完全不同的:

char buf[20];  /* Uninitialized string, backed by memory, */
char* s;       /* but an unitialized `char*` is pointing to some random */
               /* memory address. */
               /* Any attempt to access it is undefined behaviour. */

我必须添加 a.word=""; 在 strcpy 之前,然后它在 VS 中工作

这也将导致未定义的行为,因为a.word指向不允许修改的字符串文字。

唯一的两种解决方案是更改word为固定大小的数组或word在复制之前动态分配内存。在任何一种情况下,与之关联的内存都word必须足够大以存储正在复制的字符串(加上空终止字符)。

于 2013-04-19T17:50:36.870 回答