2014-02-22 65 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