C linux在windows上的分段错误
这个程序的目标是扫描一个填充了数字和空格的字符串,并将每个数字插入一个数组。然后,数组中的每个数字都被发送到checkPowerOfTwo函数,该函数确定发送的数字是否为2的幂,并打印计算结果 当我在windows上运行这个程序时,一切都正常。在Linux上运行会导致分段错误 我正在Linux服务器上编译代码,其中包含:gcc-std=c99-Wall-pedantic errors-Werror-DNDEBUG main.c-o mtm_tot。它成功编译,没有错误或警告。当我尝试运行测试仪时,问题出现了:./mtm_totC linux在windows上的分段错误,c,linux,gcc,segmentation-fault,C,Linux,Gcc,Segmentation Fault,这个程序的目标是扫描一个填充了数字和空格的字符串,并将每个数字插入一个数组。然后,数组中的每个数字都被发送到checkPowerOfTwo函数,该函数确定发送的数字是否为2的幂,并打印计算结果 当我在windows上运行这个程序时,一切都正常。在Linux上运行会导致分段错误 我正在Linux服务器上编译代码,其中包含:gcc-std=c99-Wall-pedantic errors-Werror-DNDEBUG main.c-o mtm_tot。它成功编译,没有错误或警告。当我尝试运行测试仪时
}如果大小您的程序逻辑错误:
for (int i = 0; i < size; i++) {
sscanf(token, "%d", &numbers[i]);
token = strtok(NULL, " ");
// token may become NULL here
// and sscanf will segfault right after
}
不过,可能还有其他问题。您的程序逻辑错误:
for (int i = 0; i < size; i++) {
sscanf(token, "%d", &numbers[i]);
token = strtok(NULL, " ");
// token may become NULL here
// and sscanf will segfault right after
}
但是,可能还有其他问题。输入文件test1.in如问题所示,指定大小为8,并提供9个数字
你的代码
while(token!=NULL){
for(int i=0;i<size;i++){
//printf("token is %s\n",token);
//numbers[i]=token;
sscanf(token,"%d",&numbers[i]);
//printf("Inserting %s to the array\n ",numbers[i]);
token=strtok(NULL," ");
}
}
当然,如果没有足够的值,循环后面的代码必须处理循环以i while(token!=NULL){
for(int i=0;i<size;i++){
//printf("token is %s\n",token);
//numbers[i]=token;
sscanf(token,"%d",&numbers[i]);
//printf("Inserting %s to the array\n ",numbers[i]);
token=strtok(NULL," ");
}
}
当然,如果没有足够的值,循环后面的代码必须处理循环以i如果你把剩余的数据移到开头,在一个数字之后加上新的数据,直到你读到了终止的新行,你可以使用一个太小而不能超过整个行的缓冲区STR。
你的程序在分割错误之前提供任何输出吗?我也会考虑打印。您的错误将返回到stderr而不是stdout。由于大小和数字未初始化,因此,如果大小无效,则在尝试检查main底部的二次幂时,将取消对数字中的空指针的引用。数字的malloc永远不会执行。现在是学习如何使用调试器的好时机。顺便说一句,sizeofint没有任何问题请不要读取字符串和扫描整数。sizeofint*size+1+…毫无意义。您解析输入的方法过于复杂,完全不需要为了读取一组数字而进行这种长度的分析。循环中的scanf%d和&num可以很好地工作。如果str是字符指针,则str=char*mallocsizeofint*size+1+s行IZE-1*siZeFoChar;应该引起所有的警报在你的头脑中消失:你的程序在分割错误之前提供任何输出吗?我也会考虑把你的错误打印到STDRR而不是STDUT。大小和数字未初始化,如果大小无效,则在尝试检查main底部的二次幂时,将取消对数字中的空指针的引用。数字的malloc永远不会执行。现在是学习如何使用调试器的好时机。顺便说一下,sizeofint与读取字符串和扫描整数无关。SizeFint*大小+1+。。。毫无意义。您解析输入的方法过于复杂,完全没有必要为了读取一组数字而进行如此长的分析。循环中的scanf%d,&num将非常好地工作。假定str是一个char指针,则str=char*mallocsizeofint*size+1+size-1*sizeofchar;应该会在你的头脑中引起各种各样的警报:这修复了分割错误。只要令牌内有非整数类型,您编写的sscanf行就应该为False?很好地组合了while令牌!=NULL{和forint i=0;i@eliranT请参阅我的澄清添加到修复分段错误的答案中。每当令牌内有非整数类型时,您编写的sscanf行应为False?很好地组合了while令牌!=NULL{和forint i=0;i@eliranT见我的澄清添加到答案中