用gcc编译器编译给定程序后,我尝试在ubuntu机器上运行该程序,但收到一条错误消息:Segmentation fault(core dumped),但是当我在Windows机器上的devc ++上编译/运行相同程序时,它完美地工作。有什么想法吗?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof( char *str)
{
char buffer [24];
strcpy(buffer , str);
return 1;
}
int main (int argc , char **argv)
{
char str[517];
FILE *badfile ;
badfile = fopen (" badfile ", "r");
fread(str , sizeof(char), 517, badfile);
bof(str);
printf(" Returned properly \n");
return 1;
}
最佳答案
您正在从大小最多为517个字节的str
复制到大小仅为24个字节的buffer
。
因此,如果读入的字符串长于24个字节,则将buffer
的末尾复制到不属于它的内存中。这就是undefined behavior,这意味着程序可能崩溃,看起来可以正常运行,或者可以显示其他看似随机的行为。
您需要确保不覆盖数组的边界:
// first zero out the buffer, since strncpy doesn't necessarily NULL terminate
memset(buffer, 0 sizeof(buffer));
strncpy(buffer, str, sizeof(buffer) - 1);
编辑:
正如iharob所述,从文件中读取的数据不会被NULL终止,因此调用
strcpy
可以读取str
的结尾。因此,您也需要解决这个问题:int main (int argc , char **argv)
{
char str[517];
FILE *badfile ;
badfile = fopen ("badfile", "r");
if (!badfile) {
perror("fopen failed");
exit(1);
}
// read in 1 byte less than the buffer size, and capture the return value
int len = fread(str , sizeof(char), sizeof(str)-1, badfile);
if (len == -1) {
perror("fread failed");
fclose(badfile); // don't forget to close on error
exit(1);
} else {
// add the NULL terminator
str[len]='\0';
}
bof(str);
printf(" Returned properly \n");
fclose(badfile); // don't forget to close
return 1;
}
关于c - ubuntu32bit上的段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33806493/