使用strcat()的分段故障

使用strcat()的分段故障,c,C,我在尝试连接字符串时遇到分段错误。代码的目标是创建1000个文件,每个文件的名称递增为hw7-1.data、hw7-2.data等等,直到到达hw7-999.data。它应该比我所做的更为琐碎,而它进行分段错误处理的唯一原因应该是目标字符串超出了边界,但我只是没有看到它。我知道我还有一些额外的功能,但除此之外,我不明白为什么它会在第一辆strcat上出现故障。有什么想法吗 输出为: 0 这里 分段断层 #include<stdio.h> #include<string.h>

我在尝试连接字符串时遇到分段错误。代码的目标是创建1000个文件,每个文件的名称递增为hw7-1.data、hw7-2.data等等,直到到达hw7-999.data。它应该比我所做的更为琐碎,而它进行分段错误处理的唯一原因应该是目标字符串超出了边界,但我只是没有看到它。我知道我还有一些额外的功能,但除此之外,我不明白为什么它会在第一辆strcat上出现故障。有什么想法吗

输出为:

0

这里

分段断层

#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。