用最少的更改将静态数组更改为动态数组?

问题描述:

我有一个创建字符指针数组作为以下内容的C代码:用最少的更改将静态数组更改为动态数组?

char* arr[100]; 

我使用的每个元素在该数组中为指向正被另一个函数来计算一些字符串。所以基本上arr [0]会指向string1和arr [1]到string2等。

这工作得很好。不过,现在我要求让用户将字符串数量指定为参数,从而使其更加灵活。

我该如何对代码进行最小限度的更改?我明白我需要使用malloc。然而,我在之前的所有任务陈述中收到了很多警告。我改变了数组的声明如下所示:

char* arr = (char*)malloc(n * sizeof(char*)); //where n is provided by user 

我想,我只需要改变的声明。现在所有的赋值语句都会发出警告(“赋值使得指针中的整数没有强制转换”)。以下是一个赋值语句的示例:

arr[i] = str; //where str is defined as char* and is calculated by another function 

我在这里错过了什么吗?

如果您想创建一个char *的数组,您需要一个char **arr。把它想象成一个char *的数组 - 如果你有一个int的数组,你应该有int *。由于您有一组char *s,因此您需要char **

char** arr = malloc(n * sizeof(char*)); 
+0

请取下石膏。在C中,将'void *'转换为另一个指针时不需要强制转换。 – 2012-03-10 17:05:56

+0

已更改,但我不确定OP是否使用C或C++编译器。 – 2012-03-10 21:24:05

要声明arr作为为char **,因为你是指向指针数组。如果您仅将arr声明为char *(而不是char **char *[]),则只有一个“字符串”。

您正在声明arr作为指向char的指针:要么是单个字符串,要么是,如果您愿意,可以使用数组char s。

要分配指针数组,声明arr

char **arr = malloc(n * sizeof(char *)); 

顺便提及,去除铸造:它是C.见unnecessaryQuestion 7.7comp.lang.c FAQ

不要忘了字符串数组太(char *),这样你们就需要指针数组,这应该是这样的:

char** arr = (char**)malloc(n * sizeof(char*));