Dynamic memory allocation for pointer arrays

本秂侑毒 提交于 2019-12-18 12:12:57

问题


I'm am trying to write a program that reads in a series of strings from a text file and stores these in an array of strings, dynamically allocating memory for each element. My plan was to store each string in an array using a pointer and then grow the array size as more were read in. I am having trouble to understand why my test code below is not working. Is this a workable idea?

char *aPtr;
aPtr =(char*)malloc(sizeof(char));

aPtr[0]="This is a test";


printf("%s",aPtr[0]);

回答1:


In C a string is a char*. A dynamic array of type T is represented as a pointer to T, so for char* that would be char**, not simply a char* the way you declared it.

The compiler, no doubt, has issued some warnings about it. Pay attention to these warnings, very often they help you understand what to do.

Here is how you can start your testing:

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.



回答2:


char *str; //single pointer   

With this you can store one string.


To store array of strings you Need two dimensional character array

or else array of character pointers or else double pointer


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

If you declare like this you need not allocate memory as this is static declaration


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

Here you need to allocate memory for each pointer

loop through array to allocate memory for each pointer

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

char **str;    //double pointer

Here you need to allocate memory for Number of pointers and then allocate memory for each pointer .

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

And then loop through array allocate memory for each pointer

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



回答3:


char * aPtr;

is as pointer to a character, to which you allocated memory to hold exactly 1 character.

Doing

aPrt[0] = "test";

you address the memory for this one characters and try to store the address of the literal "test" to it. This will fail as this address most likley is wider then a character.

A fix to your code would be to allocate memory for a pointer to a character.

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

Are more elegant and more over robust approach would be to allocate the same (as well as adding the mandatory error checking) by doing:

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

...



回答4:


You are doing it totally wrong. The correct version of your code should be like this:

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

You can use pointer array. if you want to store multiple string. Yes I know using for loop will be easy. But I am trying to explain in simple way even a beginner can understand.

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


来源:https://stackoverflow.com/questions/19068643/dynamic-memory-allocation-for-pointer-arrays

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!