2012-09-07 106 views
1

我有一個使用此代碼和簡短版本的程序的較長版本。這是簡短的版本,奇怪的是,這個代碼在短版本程序中運行得非常好,但由於我在更大的版本中遇到了訪問衝突,所以我感覺有些問題是錯誤的。有沒有人用下面的代碼看到任何可怕的錯誤(這可能會導致數據損壞和/或訪問違規錯誤)?或者這樣好嗎?臭名昭着動態分配指向結構數組的指針

char strlist[5][11] = { 
    { "file01.txt" }, 
    { "file02.txt" }, 
    { "file03.txt" }, 
    { "file04.txt" }, 
    { "file05.txt" } 
}; 

typedef struct DYNAMEM_DATA { 
    char *string; 
    int strlen; 
} DYNAMEM_DATA; 

typedef struct DYNAMEM_STRUCT { 
    struct DYNAMEM_DATA **data; 
    int   num_elements; 
} DYNAMEM_STRUCT; 

DYNAMEM_STRUCT *create_dynamem_struct(int num_elements, char *strlist) 
{ 
    DYNAMEM_STRUCT *ds = (DYNAMEM_STRUCT *)calloc(1, sizeof(DYNAMEM_STRUCT)); 
    wchar_t wstring[128]; 
    char len[3]; 
    int i; 

    ds->data = (DYNAMEM_DATA **)calloc(num_elements, sizeof(DYNAMEM_DATA *)); 
    ds->num_elements = num_elements; 

    for(i = 0; i < num_elements; i++) { 
     ds->data[i] = (DYNAMEM_DATA *)calloc(1, sizeof(DYNAMEM_DATA)); 
     ds->data[i]->string = (char *)calloc(1, strlen(&strlist[i*11])+5); 
     ds->data[i]->strlen = strlen(&strlist[i*11]); 
     sprintf(ds->data[i]->string, "%s, %d", &strlist[i*11], ds->data[i]->strlen); 
     mbstowcs(wstring, ds->data[i]->string, 128); 
     MessageBox(NULL, wstring, TEXT("Error"), MB_OK); 
    } 

    return ds; 
} 
+2

所以你有兩個方案,一個工程,和一個不,你告訴我們的工作之一,要求我們的問題是在一個*不*什麼?還是我誤解了一些東西? – jalf

+0

而且工作的程序不包含'main()',所以它是程序的一個工作片段...代碼不會乾淨地編譯,因爲MessageBox,TEXT和MB_OK未在此代碼中定義或聲明。檢查內存分配可能不是一個壞主意。 –

+0

較大的一個太大了,不能指望別人對它進行排序。問題是:我正在用指針和/或(m)(c)alloc來做一些愚蠢的事情嗎? –

回答

0

此代碼運行,產生5'錯誤'消息(這是預期的),並且不泄漏任何內存。在Mac OS X 10.7.4上(使用GCC 4.7.1)運行valgrind(3.7.0),它會得到一個乾淨的健康法案。

這個問題不是顯而易見的,在這個版本的代碼中。

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

char strlist[5][11] = { 
    { "file01.txt" }, 
    { "file02.txt" }, 
    { "file03.txt" }, 
    { "file04.txt" }, 
    { "file05.txt" } 
}; 

typedef struct DYNAMEM_DATA { 
    char *string; 
    int strlen; 
} DYNAMEM_DATA; 

typedef struct DYNAMEM_STRUCT { 
    struct DYNAMEM_DATA **data; 
    int   num_elements; 
} DYNAMEM_STRUCT; 

enum { MB_OK = 0 }; 
static void destroy_dynamem_data(DYNAMEM_DATA *dd) 
{ 
    free(dd->string); 
    free(dd); 
} 
static void destroy_dynamem_struct(DYNAMEM_STRUCT *ds) 
{ 
    for (int i = 0; i < ds->num_elements; i++) 
     destroy_dynamem_data(ds->data[i]); 
    free(ds->data); 
    free(ds); 
} 
static void MessageBox(const void *null, const wchar_t *wcs, const char *ncs, int status) 
{ 
    if (null == 0 || status == MB_OK) 
     fprintf(stderr, "%s\n", ncs); 
    else 
     fwprintf(stderr, L"%s\n", wcs); 
} 
static const char *TEXT(const char *arg) { return arg; } 

extern DYNAMEM_STRUCT *create_dynamem_struct(int num_elements, char *strlist); 

DYNAMEM_STRUCT *create_dynamem_struct(int num_elements, char *strlist) 
{ 
    DYNAMEM_STRUCT *ds = (DYNAMEM_STRUCT *)calloc(1, sizeof(DYNAMEM_STRUCT)); 
    wchar_t wstring[128]; 
    //char len[3]; 
    int i; 

    ds->data = (DYNAMEM_DATA **)calloc(num_elements, sizeof(DYNAMEM_DATA *)); 
    ds->num_elements = num_elements; 

    for(i = 0; i < num_elements; i++) { 
     ds->data[i] = (DYNAMEM_DATA *)calloc(1, sizeof(DYNAMEM_DATA)); 
     ds->data[i]->string = (char *)calloc(1, strlen(&strlist[i*11])+5); 
     ds->data[i]->strlen = strlen(&strlist[i*11]); 
     sprintf(ds->data[i]->string, "%s, %d", &strlist[i*11], ds->data[i]->strlen); 
     mbstowcs(wstring, ds->data[i]->string, 128); 
     MessageBox(NULL, wstring, TEXT("Error"), MB_OK); 
    } 

    return ds; 
} 

int main(void) 
{ 
    DYNAMEM_STRUCT *ds = create_dynamem_struct(5, strlist[0]); 
    destroy_dynamem_struct(ds); 
    return 0; 
} 
+0

很高興知道。非常感謝你。 –