2014-02-22 92 views
3

尋找創建一個動態數組的字符串值。動態內存/重新分配字符串數組

在下面的示例代碼中,意圖是在運行時添加一個新的數組項(realloc)和一個新的字符串(「string 3」)以添加到數組中。

我想象的問題是不正確地使用指針和/或realloc邏輯有什麼問題?

感謝任何幫助。

實際輸出我得到:

Before: 
Array[0]: string 1 
Array[1]: string 2 
After: 
Array[0]: string 1 
Array[1]: string 2 

代碼:通過這樣的

arrayIndexs = sizeof(*myArray)/sizeof(char*); 

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

char **myArray; 

main(int argc, char *argv[]) 
{ 
    int i = 0; 
    myArray = malloc(2 * sizeof(char*)); 
    int arrayIndexs = sizeof(*myArray)/sizeof(char*); 

    //Allocate memory for each [x] 
    for (i = 0; i <= arrayIndexs; i++) 
     myArray[i] = malloc(254 * sizeof(char*)); 
    //Populate initial values 
    if(myArray != NULL) 
    { 
     strcpy(myArray[0], "string 1"); 
     strcpy(myArray[1], "string 2"); 
    } 
    //Print out array values 
    printf("Before: \n"); 
    for (i = 0; i <= arrayIndexs; i++) 
     printf("Array[%d]: %s\n",i, myArray[i]); 

    //Expand array to allow one additional item in the array 
    myArray = (char **)realloc(myArray, sizeof(myArray)*sizeof(char*)); 

    //Allocate memory for the new string item in the array 
    myArray[arrayIndexs+1] = malloc(254 * sizeof(char*)); 

    //Populate a new value in the array 
    strcpy(myArray[arrayIndexs+1], "string 3"); // 

    arrayIndexs = sizeof(*myArray)/sizeof(char*); 

    //Print out array values 
    printf("After: \n"); 
    for (i = 0; i <= arrayIndexs; i++) 
     printf("Array[%d]: %s\n",i, myArray[i]); 
} 
+4

如果*永遠*發現自己嘗試使用'的sizeof()'爲*任何*,其大小*動態*,你'做錯了。記住這一點。 – WhozCraig

回答

3

如果曾經發現自己嘗試使用sizeof()任何是大小動態,你做錯了。記住這一點。 sizeof()在此代碼中被錯誤地重複使用。動態尺寸計數必須由您管理;以字節爲單位的分配大小要求可以使用這些計數連同所存儲項目的基本類型的sizeof()來管理。

鑑於:

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

int main(int argc, char *argv[]) 
{ 
    int i = 0; 
    int arrayIndexes = 2; 
    char ** myArray = malloc(arrayIndexes * sizeof(*myArray)); 

    //Allocate memory for each [x] 
    for (i = 0; i < arrayIndexes; i++) 
    { 
     myArray[i] = malloc(254 * sizeof(char)); 
     sprintf(myArray[i], "string %d", i+1); 
    } 

    //Print out array values 
    printf("Before: \n"); 
    for (i = 0; i < arrayIndexes; i++) 
     printf("Array[%d]: %s\n", i, myArray[i]); 

    // TODO: Fix this to check the result before orphaning the old 
    // value of myArray if an allocation failure ensues. 
    myArray = realloc(myArray, (arrayIndexes+1) * sizeof(*myArray)); 
    ++arrayIndexes; 

    //Allocate memory for the new string item in the array 
    myArray[arrayIndexes-1] = malloc(254 * sizeof(char*)); 

    //Populate a new value in the array 
    strcpy(myArray[arrayIndexes-1], "string 3"); // 

    //Print out array values 
    printf("After: \n"); 
    for (i = 0; i < arrayIndexes; i++) 
     printf("Array[%d]: %s\n",i, myArray[i]); 

    // TODO: write proper cleanup code just for good habits. 
    return 0; 
} 

輸出

Before: 
Array[0]: string 1 
Array[1]: string 2 
After: 
Array[0]: string 1 
Array[1]: string 2 
Array[2]: string 3 
2

您應更換此行

arrayIndexs += 1; 

原因:sizeof是一個編譯時操作符,用於確定對象的數據類型或數據類型的大小,而在此您應手動維護數組大小。

EDTIED:也初始化變量時,你應當使用

int arrayIndexs = 2; 

代替

int arrayIndexs = sizeof(*myArray)/sizeof(char*); 
+0

感謝您的好答覆 - 非常感謝,因爲完整的重做代碼示例,將WhozCraig標記爲最佳答案。 – MrDB