我很想知道为什么以下代码片段在某些C编译器中起作用而在其他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");
}
答案 0 :(得分: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
关联的内存必须足够大,以存储要复制的字符串(加上空终止字符)。