2012-11-12 88 views
2

我有以下代碼在使用asprintfrealloc時都不起作用。asprintf覆蓋內存realloc

我得到的錯誤是:

*** glibc detected *** a.out: realloc(): invalid old size: 0x006f1430 *** 

基於我已經研究它看起來像當我使用asprintf它覆蓋一些內存realloc用途。這對我沒有意義,因爲asprintf應該是安全的並且使用適當的字符串長度進行動態分配。不使用asprintf會導致程序運行正常,但我需要爲我的項目提供asprintf的功能。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 
    int ifCount = 1; 
    int stringCount = 1; 
    char** IFs = NULL; 

    //Broken code 
    char* message; 
    asprintf(&message, "Hello: %d", stringCount); 

    //Working code, but not the alternative I want to take 
    //char* message = "Hello"; 

    IFs = (char**) realloc(IFs, sizeof(char*) * ifCount); 
    IFs[ifCount - 1] = (char*) realloc(IFs[ifCount - 1], sizeof(char) * strlen(message)); 
    strcpy(IFs[ifCount - 1], message); 

    printf("Message: %s\n", message); 
    printf("Copy: %s\n", IFs[ifCount - 1]); 
    free(message); 
} 
+0

當你的問題在這裏得到解決時,不要改變你的帖子的名字,以便在你的問題中包括'(回答)'。只需通過解決問題的答案單擊複選標記 – Mike

回答

5

此:

IFs[ifCount - 1] = (char*) realloc(IFs[ifCount - 1], sizeof(char) * strlen(message)); 

行經未初始化指針realloc(),這是錯誤的原因。

另外:

  1. 記住字符串需要終止的空間,上面分配strlen(message)字符,這是1太少。這會導致strcpy()複製時執行緩衝區溢出。
  2. 請記住realloc()與分配堆內存的所有函數一樣可能會失敗。 asprintf()也是如此。
  3. Don't cast the return value of realloc() in C
  4. 避免sizeof (char),因爲它總是1,所以代碼的價值很小。
0

而不是使用reallocNULL或者未初始化的第一個參數,只需用malloc開始。

如果realloc調用是必要的IFs[ifCount - 1] = (char*) realloc(...)通話,然後前行,用calloc代替 - 這將超出分配的內存至少爲零,從而realloc給予適當NULL指針。

+1

不,使用初始化爲all-bits-zero的calloc()對指針無效。不能保證all-bits-zero是適用於NULL指針的內存模式。 – unwind

+0

感謝您的澄清 - 讚賞。 – prprcupofcoffee