2015-10-26 56 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, .......... 

}