2015-10-26 38 views
-2

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

    } 
} 
+3

'文件名=“./ HW7 - ”'没有做什么,你认为它。 –

+0

''filename =“./ hw7 - ”;' - >'strcpy(filename,“./hw7 - ”);' – BLUEPIXY

+1

''''''''''''''''' – Downvoter

回答

2

问题是由线路引起的:

filename="./hw7-"; 
  1. 您已丢失由malloc分配的初始内存。
  2. filename现在指向程序的只读存储器部分。

更改该行:

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-"); 

代替assignung指针。

另一种方法是在一行中使用函数sprintf而不是多次调用字符串函数。

我不认为你需要为这么短的字符串动态分配内存。您可以使用字符数组或变长字符数组(VLA)。

+1

@Jongware是的,他可以使用sprintf。 –

1

你的代码比需要的复杂得多。其他答案指出你的错误,但这是一个写作相同效果的替代方法。我假设你的意思是使用number而不是1每次:

for (int x = 0; x < 1000; ++x) 
{ 
    char filename[100]; 
    sprintf(filename, "./hw7-%d.data", x); 
    int fd2 = open(filename, .......... 

}