gpt4 book ai didi

c - strcpy 上的段错误

转载 作者:行者123 更新时间:2023-11-30 21:48:21 26 4
gpt4 key购买 nike

我有一个以

开头的函数
void findErrors(int lineIndex){
char *line;
strcpy(line, lines[lineIndex]);

然后调用另一个函数,开头为

void fixErrors(int lineIndex, char *word){
char *line;
strcpy(line, lines[lineIndex]);

第一个函数可以工作,但是当它调用第二个函数时我遇到了段错误。两个单词的 lineIndex 相同,并且 findErrors 不会调用lines 数组,除了在 strcpy() 中。为什么会发生这种情况?这是使用该函数的糟糕方法吗?我只是在第一个函数上很幸运?如果我更改 fixErrors 中的行,问题就会消失

char *line;

char line[255];

但我不想在一条巨大的线路上出现另一个段错误。我想我也可以

char *line = malloc(strlen(lines[lineIndex])+1)

但我真的很好奇为什么第一种方法不起作用。

最佳答案

void findErrors(int lineIndex){
char *line;
strcpy(line, lines[lineIndex]);
//^ this is undefined behaviour.

此时,line 尚未初始化,并且将某些内容复制到未初始化的指针会导致未定义的行为,通常是段错误。

但是,如果line偶然指向一些有效的内存,程序可能不会崩溃,而且看起来好像可以工作。这是未定义的行为。

它的工作情况:

void findErrors(int lineIndex){
char line[255];
strcpy(line, lines[lineIndex]);

此处line指向长度为255的缓冲区。只要源字符串的长度小于254,您就可以strcpy到此缓冲区而不会出现问题。

为什么“小于 254”而不是 255?

因为我们还需要一个字符作为零终止符。

关于c - strcpy 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36066741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com