выделить память для 2d массив символов на лету

голоса
-1

Я пытаюсь выделить память в 2d массив символов, как я могу определить его размер. (Счетчик считается неизвестным значением), кажется, работают пока что-то начинает переназначить данные мусора в массив

0xd28fe280 -> 3
0xd28fe280 -> 3
0xd28fe280 -> 3
0xd28fe280 -> 3
0xd28fe280 -> ���[U
0xd28fe280 -> ���[U

то, что по сути то, что я хочу сделать, это выделить память, прежде чем я заполнить массив со строками.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
  int count = 6;
  char **words;
  words = malloc(0);
  for(int i = 0;i < count; i++){
    words[i] = malloc(10);
    strcpy(words[i],3);
    printf(%#08x -> %s\n,words[0],words[0]);
  }
  free(words);
  return 0;
}
Задан 07/11/2018 в 20:09
источник пользователем
На других языках...                            


1 ответов

голоса
1

Это на самом деле не является 2D массив, это указатель на указатель символов ( char **).

wordsточка к блоку char *, где каждый элемент этого блока указывает на charблок. Вы только выделили память для charблоков, но не для char *блока. (Вы выделили его с размером 0 , так что вы не можете получить доступ к нему). Кроме того, необходимо освободить каждый блок вы выделенный, в противном случае память утекает. Было бы также хорошая практика , чтобы проверить возвращаемое значение malloc, так как она возвращается , NULLесли это не удается , и далее разыменования NULLуказателя приведет к непредсказуемому поведению.

Это должно работать:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int count = 6, max_len = 10, words_n = 0;
    char **words = NULL;

    for(int i=0; i<count; i++)
    {
        words = realloc(words, ++words_n * sizeof *words);
        if(!words)
        {
            //Error handling
            return -1;
        }
        words[i] = malloc(max_len * sizeof *words[i]); 
        if(!words[i])
        {
            //Error handling
            return -1;
        }
        strncpy(words[i], "3", max_len); //Better to protect against overflows.
        words[i][max_len-1] = '\0';
        printf("%p -> %s\n", (void*)words[0], words[0]); //"%p" for printing pointers.
    }

    for(int i=0; i<count; i++)
    {
        free(words[i]); //Free every allocated element.
    }
    free(words);

    return 0;
}
Ответил 08/11/2018 в 15:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more