为什么VS在编译strcpy函数中使用的未初始化字符串时会抛出错误?

Joh*_*n R 0 c string struct pointers strcpy

我很想知道为什么以下代码片段在某些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");
}
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 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. */
Run Code Online (Sandbox Code Playgroud)

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

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

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