Подтвердить что ты не робот

Динамическое распределение памяти для массивов указателей

Я пытаюсь написать программу, которая читает в последовательности строк из текстового файла и сохраняет их в массиве строк, динамически выделяя память для каждого элемента. Мой план состоял в том, чтобы хранить каждую строку в массиве с помощью указателя, а затем увеличивать размер массива по мере того, как читалось больше. Мне трудно понять, почему мой тестовый код ниже не работает. Это эффективная идея?

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

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


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

Ответ 1

В 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.

Ответ 2

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

Ответ 3

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

...

Ответ 4

Вы делаете это совершенно неправильно. Правильная версия вашего кода должна выглядеть примерно так:

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