C中的strcpy seg故障
好奇这个strcpy到底出了什么问题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
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);