C中的strcpy seg故障

C中的strcpy seg故障,c,segmentation-fault,strcpy,C,Segmentation Fault,Strcpy,好奇这个strcpy到底出了什么问题 int main(void){ char *history[10]; for(int i = 0; i < 10; i++){ history[i] = NULL; } char line[80]; fgets(line,80,stdin); strcpy(history[0],line); //This line segfaults } int main(无效){ char*历史[1

好奇这个strcpy到底出了什么问题

int main(void){
    char *history[10];
    for(int i = 0; i < 10; i++){
        history[i] = NULL;
    }
    char line[80];
    fgets(line,80,stdin); 
    strcpy(history[0],line); //This line segfaults
}
int main(无效){
char*历史[10];
对于(int i=0;i<10;i++){
历史[i]=空;
}
字符行[80];
fgets(第80行,标准DIN);
strcpy(历史[0],第行);//这一行有故障
}

您已经创建了一个空指针数组。然后您尝试将字符复制到NULL。那是不可以的

编辑: 您的程序可以优化为:

void main() {
   char line[80];
   fgets(line,80,stdin); 
}
历史记录数组从未用于生成任何输出。因此,虽然其他人指出您需要分配内存,但从技术上讲,您可以简单地这样做:

history[0] = line;

这将是一个有效的指针,直到该行超出范围,也就是说,当历史超出范围时,这就无关紧要了。

您需要为
历史[0]
分配内存。由于
历史[0]
被赋值为空,引用它或写入它将/可能导致segfault

差不多

//this will create memory for 100 chars
history[0] = malloc(sizeof(char) * 100); 
strcpy(history[0],line);


您正在执行strcpy(NULL,line)。您忘记将存储分配给
历史记录[0]
,因此它当然会爆炸。您可以改为使用
history[0]=strdup(line)
。通过
char history[10]
修改历史的定义,并使用
strcpy(history,line)
,因为
char*
声明历史的元素是指针,而不是字符。初始化历史的最佳方法是什么?也谢谢你的邀请help@MoStack,初始化为NULL是可以的,但是当你想用它来存储字符时,你应该给它分配内存。如果你把“will/may cause segfault”改为“may behavity”。你不能说它“将导致一个segfault”的原因是它给出了一个定义;这定义了结果,在标准C中,结果被认为是未定义的。其他事情也可能发生。通常不会导致SEGFULTS的未定义行为的显著示例包括:漏洞,如缓冲区溢出和格式字符串漏洞、争用条件(多个线程同时访问同一资源)、有符号整数溢出和。。。如果在某些设备上运行,则为。
//shortcut for both - this allocate new memory and returns pointer.
history[0] = strdup(line);