使用strcat()的分段错误
尝试连接字符串时出现分段错误。代码的目标是创建1000个文件,每个文件的名称都增加hw7-1.data,hw7-2.data等,直到您到达hw7-999.data。它应该比我做的更微不足道,它的唯一原因就是目标字符串超出范围,但我只是没有看到它。我知道我还有一些额外的东西,但除此之外,我不明白为什么它会在第一个strcat上进行分割。任何想法为t使用strcat()的分段错误
的输出是:
这里
波段故障
#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);
}
}
问题是由线路引起的:
filename="./hw7-";
- 您已丢失由
malloc
分配的初始内存。 -
filename
现在指向程序的只读存储器部分。
更改该行:
strcpy(filename, "./hw7-");
PS
这不是从您的帖子你的意图是与number
和end
清晰。
您为end
分配内存,但我没有看到在此之后的任何地方使用的end
。
填写number
并致电sprintf
,但此后不使用它。
您用malloc
分配内存,但没有任何调用来释放内存。您需要添加:
free(end);
free(filename);
free(number);
main
结束之前。
不仅如此 - 数字字符串从未被创建后使用... –
你分配的内存
filename=malloc(100);
现在指针文件名指向分配的内存。
但你重新分配这个指针
filename="./hw7-";
现在它指向字符串中的静态存储器文字。您丢失了以前分配的内存地址。结果是存在内存泄漏。
字符串文字在C和C++中是不可变的。所以你可能不会在字符串文字中使用strcat,而且strcat试图超出字符串文字。
strcat(filename,"1");
你应该写
strcpy(filename, "./hw7-");
代替assignung指针。
另一种方法是在一行中使用函数sprintf
而不是多次调用字符串函数。
我不认为你需要为这么短的字符串动态分配内存。您可以使用字符数组或变长字符数组(VLA)。
@Jongware是的,他可以使用sprintf。 –
你的代码比需要的复杂得多。其他答案指出你的错误,但这是一个写作相同效果的替代方法。我假设你的意思是使用number
而不是1
每次:
for (int x = 0; x < 1000; ++x)
{
char filename[100];
sprintf(filename, "./hw7-%d.data", x);
int fd2 = open(filename, ..........
}
'文件名=“./ HW7 - ”'没有做什么,你认为它。 –
''filename =“./ hw7 - ”;' - >'strcpy(filename,“./hw7 - ”);' – BLUEPIXY
''''''''''''''''' – Downvoter