希望创建一个动态的字符串值数组。
在下面的示例代码中,目的是添加一个新数组项(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]);
}
答案 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*);