使用strcat()的分段故障
我在尝试连接字符串时遇到分段错误。代码的目标是创建1000个文件,每个文件的名称递增为hw7-1.data、hw7-2.data等等,直到到达hw7-999.data。它应该比我所做的更为琐碎,而它进行分段错误处理的唯一原因应该是目标字符串超出了边界,但我只是没有看到它。我知道我还有一些额外的功能,但除此之外,我不明白为什么它会在第一辆strcat上出现故障。有什么想法吗 输出为: 0 这里 分段断层使用strcat()的分段故障,c,C,我在尝试连接字符串时遇到分段错误。代码的目标是创建1000个文件,每个文件的名称递增为hw7-1.data、hw7-2.data等等,直到到达hw7-999.data。它应该比我所做的更为琐碎,而它进行分段错误处理的唯一原因应该是目标字符串超出了边界,但我只是没有看到它。我知道我还有一些额外的功能,但除此之外,我不明白为什么它会在第一辆strcat上出现故障。有什么想法吗 输出为: 0 这里 分段断层 #include<stdio.h> #include<string.h>
#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);
}
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
int x;
字符*数字;
数量=malloc(10);
字符*文件名;
文件名=malloc(100);
字符*结束;
end=malloc(10);
对于(x=0;x而言,问题是由线路引起的:
filename="./hw7-";
您丢失了由malloc
分配的初始内存
filename
现在指向程序的只读内存部分
将该行更改为:
strcpy(filename, "./hw7-");
PS
从你的帖子中不清楚你对number
和end
的意图
您为end
分配内存,但我看不到end
在这之后的任何地方使用。
您可以通过调用sprintf
来填充number
,但之后就不用它了
您使用malloc
分配内存,但没有任何取消分配内存的调用。您需要添加:
free(end);
free(filename);
free(number);
在main
结束之前,您分配了内存
filename=malloc(100);
现在指针文件名指向分配的内存
但是你重新分配了这个指针
filename="./hw7-";
现在,它指向静态内存中的字符串文字。您丢失了以前分配的内存的地址。结果是内存泄漏
<>字符串字符串在C和C++中是不可变的。因此,您可能不使用字符串文本,而且StrCAT试图写超出字符串文字。
strcat(filename,"1");
你应该写
strcpy( filename, "./hw7-" );
而是指定指针
另一种方法是在一行中使用函数sprintf
,而不是多次调用字符串函数
我认为您不需要为这么短的字符串动态分配内存。您可以使用字符数组或可变长度字符数组(VLA).您的代码比需要的复杂得多。其他答案指出了您的错误,但这里有另一种书写相同效果的方法。我假设您每次都想使用number
而不是1
:
for (int x = 0; x < 1000; ++x)
{
char filename[100];
sprintf(filename, "./hw7-%d.data", x);
int fd2 = open(filename, ..........
}
for(int x=0;x<1000;++x)
{
字符文件名[100];
sprintf(文件名“./hw7-%d.data”,x);
int fd2=打开(文件名。。。。。。。。。。
}
filename=“/hw7-”;
不会做你认为它会做的事。filename=“/hw7-”;
-->
strcpy(filename=“/hw7-”);你最好在malloc
之后使用免费的是的,他可以使用sprintf。