Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 动态分配内存大小会导致堆栈崩溃错误_C_File_Strcat - Fatal编程技术网

C 动态分配内存大小会导致堆栈崩溃错误

C 动态分配内存大小会导致堆栈崩溃错误,c,file,strcat,C,File,Strcat,情况相当简单,但我不知道为什么缓冲区溢出。我正试图打印出一个文件的内容。将静态int分配给计数是可行的,但是任何查找文件大小的方法都会导致出现此错误并退出程序 来源: char path[] = "upload/"; strcat(path, filename); FILE *file; file = fopen(path, "r"); fseek(file, 0, SEEK_END); int count = ftell(file); printf("%d\n",count); char

情况相当简单,但我不知道为什么缓冲区溢出。我正试图打印出一个文件的内容。将
静态int
分配给
计数
是可行的,但是任何查找文件大小的方法都会导致出现此错误并退出程序

来源:

char path[] = "upload/";
strcat(path, filename);

FILE *file;

file = fopen(path, "r");
fseek(file, 0, SEEK_END);
int count = ftell(file);
printf("%d\n",count);
char *buffer = malloc(count);

fseek(file, 0, SEEK_SET);


fread(buffer, count, 1, file);
printf("%s\n", buffer);
free(buffer);
fclose(file);
任何帮助都将不胜感激

在您的代码中

char path[] = "upload/";
strcat(path, filename);
数组
路径
仅为
上传
和空终止符分配了空间(即大小)。将此用作strcat()的目标是访问超出范围的内存,这会导致错误

来自(矿山)

strcat()
函数将
src
字符串附加到
dest
字符串,覆盖
dest
末尾的终止空字节(
'\0'
),然后添加终止空字节。字符串不能重叠,并且
dest
字符串必须有足够的空间来显示结果。如果
dest
不够大,则程序行为不可预测

也就是说

  • 返回一个
    long
    ,您应该相应地更改
    计数的类型
  • 在使用返回值之前,应始终检查函数调用的返回值是否成功
在您的代码中

char path[] = "upload/";
strcat(path, filename);
数组
路径
仅为
上传
和空终止符分配了空间(即大小)。将此用作strcat()的目标是访问超出范围的内存,这会导致错误

来自(矿山)

strcat()
函数将
src
字符串附加到
dest
字符串,覆盖
dest
末尾的终止空字节(
'\0'
),然后添加终止空字节。字符串不能重叠,并且
dest
字符串必须有足够的空间来显示结果。如果
dest
不够大,则程序行为不可预测

也就是说

  • 返回一个
    long
    ,您应该相应地更改
    计数的类型
  • 在使用返回值之前,应始终检查函数调用的返回值是否成功

ftell
返回一个长整数。您不能将strcat返回到这样的数组中。您忘记为终止的NUL字符分配一个额外的字节。此外,您没有检查这些函数的返回值。您必须检查
fopen
malloc
fseek
fread
等的返回值并对其采取行动。如果您没有,你永远不会有任何线索。
ftell
返回一个长整数。你不能
strcat
这样的数组。你忘了为终止的NUL字符分配一个额外的字节。此外,你没有检查这些函数的返回值。您必须检查
fopen
malloc
fseek
fread
等的返回值并对其采取行动。如果不检查,您将永远不会有任何线索。