这个问题在这里已有答案:
-
Correct way to malloc space for a string and then insert characters into that space? 3个答案
-
Definitive List of Common Reasons for Segmentation Faults 1回答
我得到了这段代码的分段错误,我不能,因为我的生活,找出原因 . 我对指针很新,所以它可能是显而易见的 . 该代码应该从stdin获取两行整数并以交替方式打印出来 . 我还没有完成打印出交替数字的代码的最后部分 .
int main(){
char *str1 = NULL;
char *str2 = NULL;
size_t sz = 0;
int i;
int x;
char *rp1 = NULL;
char *rp2 = NULL;
getline(&str1, &sz, stdin);
getline(&str2, &sz, stdin);
char *result1;
result1 = malloc(sizeof(*str1));
char *result2;
result2 = malloc(sizeof(*str2));
for(i = 0; (x = sscanf(str1, "%s ", &result1[i])) > 0; i++){
if(x == EOF){
return 0;
}
if(!isdigit(result1[i])){
fprintf(stderr, "Error: invalid non-integer input\n");
return 1;
}
}
rp1 = malloc(i);
rp1 = result1;
for(i = 0; sscanf(str2, "%s ", &result2[i]) > 0; i++){
if(!isdigit(result2[i])){
fprintf(stderr, "Error: invalid non-integer input\n");
return 1;
}
}
rp2 = malloc(i);
rp2 = result2;
return 0;
}
当我运行gdb时,它说我在第25行遇到了分段错误,这是循环的第一个 .
编辑:所以我修复了for循环之前malloc函数中的一个问题,但我仍然遇到了分段错误 .
2 回答
问题1:
sizeof(*str[1-2])
与sizeof(char)
相同 . 您为两个结果缓冲区分配了一个char,这显然是不够的 . 使用strlen(str[1-2]) + 1
这将为您提供一个缓冲区,该缓冲区等于字符串中的字符数,再加上一个用于空终止符的缓冲区 .问题2:
getline()
分配一个缓冲区,在你完成它之后你需要free()
,你没有这样做,这实际上是一个内存泄漏 . 这不是你问题的原因,但值得一提 . 你所有的记忆都是如此 .这段代码存在很多问题 . 其他人已经指出了问题,但总的来说这是不必要的复杂问题 . 可以消除所有中间变量并直接访问
str1
和str2
.为简化起见,我将把它减少到只有一个输入字符串
str
. 如果你想要两个,代码应该放在一个函数而不是复制 .for
sscanf
循环似乎试图遍历str
并检查它是否只包含数字 . 通过遍历字符数组直到您在末尾点击空字符,可以更好地完成此操作 .所以检查输入的每个字符是否为数字......
这将失败,因为从stdin读取的
str
在结尾处有一个换行符 .