2014-03-01 26 views
1

我一直在努力,現在調試這一個小時,但我失敗了。我有一個可變參數函數,set_buffer,這需要在緩衝區設置輸入字符串轉換爲分段故障與可變參數函數

void set_buffer(char *buf, int num_str, ...) { // destructively sets buffer with the strings provided, in the order they are provided. Must provide number of arguments so function knows where to stop. 
    size_t length = sizeof(buf)/sizeof(*buf); // strlen() fails because it depends on the null terminator... 
    printf("length: %d\n", length); 
    va_list args; 
    va_start(args, num_str); // va_start takes on the NAME of the last known parameter in the function to determine where to start taking in optional arguments 
    for (int i = 0, offset = 0; i < num_str && offset < length; ++i) { 
     char *str = va_arg(args, char *); 
     printf("length of str: %d\n", strlen(str)); // SEG FAULT ERROR 
     offset += snprintf(buf+offset, strlen(str)+1, "%s", str); // I must be adding too much of an offset, resulting in a seg fault 
     if (i != (num_str - 1)) { 
      //offset -= 1; 
     } 
    } 
    va_end(args); 
} 

我懷疑它可能有一些做的,從所使用的va_list ARGS參數不正確的抓取。

+0

究竟什麼是你的問題,你爲什麼不提供再現問題的完整最低工作的代碼示例? – 2014-03-01 00:34:43

回答

3

sizeof(buf)/sizeof(*buf)只能如果buf具有數組類型,而不是一個指針。取決於您是在32位還是64位目標上,它將評估爲常數4或8。

你需要傳遞一個參數指定可用緩衝區大小。

這不正好指向崩潰,因爲結果是僅用於offset < length測試。 (這是順便說一下,不正確的。你應該使用length限制指定snprintf的空間)要看看會發生什麼錯誤,我們需要一個完整的,獨立的測試案例。

+0

因爲我們不能使用sizeof(),所以我會如何獲得函數外的緩衝區的大小? –

+1

@GeorgeNewton緩衝區大小是需要考慮的。在任何你通過緩衝區的地方,也要通過它的大小。如有必要,使用'struct'。或者硬編碼一個保守的大小,所以它總是事先知道。 – Potatoswatter

+0

我不明白。所以你告訴我,然後當我做char * ptr = malloc(...) - 除非硬編碼,否則我找不到長度/大小? –

3

你不能這樣做sizeof(buf)/sizeof(*buf),因爲

sizeof(buf) == sizeof(char*) 
sizeof(*buf) == sizeof(char) 

那麼,你是切實做好:sizeof(char*)/sizeof(char)