使用strcat()

时间:2015-10-26 19:42:55

标签: c

尝试连接字符串时出现分段错误。该代码的目标是创建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);

    }
}

3 个答案:

答案 0 :(得分:2)

问题是由以下行引起的:

filename="./hw7-";
  1. 您丢失了由malloc分配的初始内存。
  2. filename现在指向程序的只读内存部分。
  3. 将该行更改为:

    strcpy(filename, "./hw7-");
    

    <强> PS

    您的帖子中不清楚您对numberend的意图是什么。

    您为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, ..........

}