【问题标题】:Dynamic memory/realloc string array动态内存/重新分配字符串数组
【发布时间】:2014-02-22 05:56:38
【问题描述】:

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

在下面的示例代码中,目的是在运行时添加一个新的数组项(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]);
}

【问题讨论】:

    标签: c arrays memory


    【解决方案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;
    }
    

    输出

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

    【讨论】:

      【解决方案2】:

      你应该替换这一行:

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

      通过这样的方式:

      arrayIndexs += 1;
      

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

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

      int arrayIndexs = 2;
      

      而不是

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

      【讨论】:

      • 感谢您的快速回答 - 非常感谢,由于完全重新编写的代码示例,将 WhozCraig 标记为最佳答案。
      猜你喜欢
      • 2017-03-28
      • 2017-12-10
      • 2022-01-01
      • 2018-06-16
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多