指针数组的动态内存分配

我正在尝试编写一个程序,该程序从文本文件中读取一系列字符串,并将它们存储在字符串数组中,为每个元素动态分配内存。 我的计划是使用指针将每个字符串存储在一个数组中,然后在读入更多数据时增大数组大小。我很难理解为什么我的测试代码无效。 这是一个可行的想法吗?

char *aPtr; aPtr =(char*)malloc(sizeof(char)); aPtr[0]="This is a test"; printf("%s",aPtr[0]); 

在C中,字符串是char* 。 类型为T动态数组表示为指向T的指针,因此对于char* ,它将是char** ,而不是简单的char* ,就像你声明它一样。

毫无疑问,编译器已发出一些警告。 注意这些警告,通常它们可以帮助您了解要做什么。

以下是开始测试的方法:

 char **aPtr; int len = 1; // Start with 1 string aPtr = malloc(sizeof(char*) * len); // Do not cast malloc in C aPtr[0] = "This is a test"; printf("%s",aPtr[0]); // This should work now. 
 char *str; //single pointer 

有了这个,你可以存储一个字符串。


要存储array of strings需要two dimensional character array

或者array of character pointers或者是double pointer


 char str[10][50]; //two dimensional character array 

如果你这样声明你不需要分配内存,因为这是静态声明


 char *str[10]; //array of pointers 

在这里,您需要为每个指针分配内存

循环遍历数组以为每个指针分配内存

 for(i=0;i<10;i++) str[i]=malloc(SIZE); 

 char **str; //double pointer 

在这里,您需要为指针数分配内存,然后为每个指针分配内存。

 str=malloc( sizeof(char *)*10); 

然后循环遍历数组为每个指针分配内存

 for(i=0;i<10;i++) str[i]=malloc(SIZE); 
 char * aPtr; 

是指向一个字符的指针,您为其分配了1字符。

 aPrt[0] = "test"; 

你为这一个字符寻址内存并尝试将文字"test"的地址存储到它。 这将失败,因为这个地址最有可能比一个角色更宽。

修复代码的方法是为指向字符的指针分配内存。

 char ** aPtr = malloc(sizeof(char *)); aPtr[0] = "test"; printf("%s", aPtr[0]); 

更优雅,更强大的方法是通过执行以下操作来分配相同的(以及添加强制性错误检查):

 char ** aPtr = malloc(sizeof *aPtr); if (NULL == aPtr) { perror("malloc() failed"); exit(EXIT_FAILURE); } ... 

你这样做完全错了。 您的代码的正确版本应如下所示:

 int main () { char *aPtr; aPtr =(char*)malloc(20*sizeof(char)); aPtr ="This is a test"; printf("%s",aPtr); } 

您可以使用指针数组。 如果你想存储多个字符串。 是的,我知道使用for循环很容易。 但我试图以简单的方式解释即使初学者也能理解。

 int main () { char *aPtr[10]; aPtr[0] =(char*)malloc(20*sizeof(char)); aPtr[0] ="This is a test"; aPtr[1] =(char*)malloc(20*sizeof(char)); aPtr[1] ="This is a test2"; printf("%s\n%s\n",aPtr[0],aPtr[1]); }