2013-04-12 33 views
-1

我對C很糟糕,並且在使用strcpy時遇到了問題。我試圖抓住一個函數參數並將其存儲在一個char數組中。當我運行這個時,我遇到了分段錯誤,但我不明白爲什麼。我究竟做錯了什麼?謝謝!strcpy問題

struct bb_state { 
    FILE *logfile; 
    char *rootdir; 
}; 

struct bb_state *bb_data; 
bb_data = malloc(sizeof(struct bb_state)); 
strcpy(bb_data->rootdir, argv[argc-2]); 
+1

有必要確保指針('bb_data-> rootdir')指向的區域。 – BLUEPIXY

+0

你檢查過'bb_data-> rootdir'的大小嗎?在'char * strcpy(char * destination,const char * source)'中:爲了避免**溢出**,** destination **指向的數組的大小應足夠長以包含與**相同的C字符串源**(包括終止空字符),並且不應該在內存中與源重疊。 –

回答

2

您必須爲char* rootdir分配內存。

例子:

int len=strlen(argv[argc-2])+1; 
bb_data->rootdir=malloc(len); 

之後,你可以這樣做:

strcpy(bb_data->rootdir, argv[argc-2]); 
+1

如果'strdup'可用,它可以在一行中執行上述步驟。 –

+0

這是有效的。謝謝! – Alex

1

您需要爲rootdir分配空間。估計你想有多少個字符複製,並可以爲rootdir做另一malloc

確保argv是大到足以使用argc-2被索引。這也可能導致崩潰。

bb_data->rootdir = malloc(strlen(argv[argc-2]+1)); 
1

我試圖抓住的函數的參數之一,它店在字符數組

與您的代碼的問題是,你沒有一個字符數組其中存儲複製的說法。你有什麼是一個指針。您必須分配用於複製參數的存儲。或者,您可以使rootdir成爲數組而不是指針,但您必須小心以防止副本溢出固定大小的數組。

分配存儲

bb_data->rootdir = malloc(strlen(argv[argc - 2]) + 1); // +1 is for the NULL 

製作ROOTDIR陣列

#include <limits.h> 
#include <stddef.h> 
#include <stdlib.h> 

... 

    struct bb_state { 
     FILE *logfile; 
     char rootdir [PATH_MAX]; 
    }; 

    struct bb_state *bb_data; 
    size_t   len; 
    len = strlen(argv[argc - 2]); 
    if (len >= PATH_MAX) { 
     // Argument is too long. 
     fprintf(stderr, "Argument is too long: %s\n", argv[argc - 2]); 
     return EXIT_FAILURE; 
    } 
    bb_data = malloc(sizeof(struct bb_state)); 
    strcpy(bb_data->rootdir, argv[argc - 2]);