尝试连接字符串时出现分段错误。该代码的目标是创建1000个文件,每个文件具有递增名称hw7-1.data,hw7-2.data等,直到你到达hw7-999.data。它应该比我做的更简单,而且它是segfaulting的唯一原因应该是目标字符串超出界限,但我只是没有看到它。我知道有几个额外的包含,但除此之外我不明白为什么它是第一个strcat上的segfaulting。任何想法,如
输出结果为:
0
下面
Seg Fault
#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(void)
{
int x;
char* number;
number=malloc(10);
char* filename;
filename=malloc(100);
char* end;
end=malloc(10);
for (x=0; x<1000; x++)
{
filename="./hw7-";
sprintf(number, "%d", x);
printf("%s\n", number);
printf("Here \n");
strcat(filename,"1");
printf("Here \n");
strcat(filename,".data");
printf("Here \n");
int fd2 = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH);
}
}
答案 0 :(得分:2)
问题是由以下行引起的:
filename="./hw7-";
malloc
分配的初始内存。filename
现在指向程序的只读内存部分。将该行更改为:
strcpy(filename, "./hw7-");
<强> PS 强>
您的帖子中不清楚您对number
和end
的意图是什么。
您为end
分配了内存,但在此后的任何地方我都没有看到end
。
您通过拨打number
来填充sprintf
,但之后您不会使用它。
您使用malloc
分配内存,但没有任何调用来取消分配内存。你需要添加:
free(end);
free(filename);
free(number);
在main
结束之前。
答案 1 :(得分:2)
你分配了内存
filename=malloc(100);
现在指针文件名指向已分配的内存。
但是你重新分配了这个指针
filename="./hw7-";
现在它指向静态内存中的字符串文字。您丢失了先前分配的内存的地址。结果是内存泄漏。
字符串文字在C和C ++中是不可变的。所以你可能不会将strcat与字符串文字一起使用,而且strcat试图超出字符串文字。
strcat(filename,"1");
你应该写
strcpy( filename, "./hw7-" );
而是指定指针。
另一种方法是在一行中使用函数sprintf
,而不是几次调用字符串函数。
我认为你不需要为这么短的字符串动态分配内存。您可以使用字符数组或可变长度字符数组(VLA)。
答案 2 :(得分:1)
您的代码比它需要的复杂得多。其他答案指出了你的错误,但这是另一种写出相同效果的方法。我假设您每次都要使用number
而不是1
:
for (int x = 0; x < 1000; ++x)
{
char filename[100];
sprintf(filename, "./hw7-%d.data", x);
int fd2 = open(filename, ..........
}