我的代码出现了分段错误,在我的生活中,我无法找出原因。我对指针很新,所以它可能是显而易见的。该代码应该从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函数中的一个问题,但我仍然遇到了分段错误。
答案 0 :(得分:1)
问题1:
sizeof(*str[1-2])
与sizeof(char)
相同。您为两个结果缓冲区分配了一个char,这显然是不够的。使用strlen(str[1-2]) + 1
这将为您提供一个缓冲区,该缓冲区等于字符串中的字符数,再加上一个用于空终止符的缓冲区。
问题2:
getline()
分配一个缓冲区,在你完成它之后你需要free()
,你没有这样做,这实际上是一个内存泄漏。这不是你问题的原因,但值得一提。所有malloc()
内存都是如此。
答案 1 :(得分:1)
此代码存在很多问题。其他人已经指出malloc
问题,但总的来说它不必要地复杂化。可以消除所有中间变量,并直接访问str1
和str2
。
为简化起见,我将把它减少到只有一个输入字符串str
。如果你想要两个,那么代码应该被放入一个函数而不是复制。
for
+ sscanf
循环似乎试图遍历str
并检查它是否只包含数字。通过遍历字符数组直到你在末尾点击空字符来实现这一点要好得多。
for(int i = 0; str[i] != '\0'; i++){
...do something with str[i]...
}
因此,检查输入的每个字符是否为数字......
for(int i = 0; str[i] != '\0'; i++){
if(!isdigit(str[i])){
fprintf(stderr, "Error: invalid non-integer input '%c'\n", str[i]);
return 1;
}
}
这将失败,因为从标准输入读取的str
在结尾处有换行符。