动态内存/ realloc字符串数组

时间:2014-02-22 05:56:39

标签: c arrays memory

希望创建一个动态的字符串值数组。

在下面的示例代码中,目的是添加一个新数组项(realloc)和一个在运行时添加到数组的新字符串(“string 3”)。

我想问题是指针的使用不当和/或realloc逻辑有什么问题?

感谢任何帮助。

我得到的实际输出:

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

代码:

#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]);
}

2 个答案:

答案 0 :(得分:3)

如果您发现自己试图将<{1>}用于动态动态的任何,那么您做错了。记在脑子里。错误地在此代码中重复使用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;
}

答案 1 :(得分:2)

你应该替换这一行:

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

通过以下方式:

arrayIndexs += 1;

原因:sizeof是一个编译时运算符,用于确定对象的数据类型或数据类型的大小,而在这里您应手动维护数组大小。

EDTIED:同样在初始化变量时,您应使用

int arrayIndexs = 2;

而不是

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