Распределены ли строковые массивы в C в стеке? - PullRequest
5 голосов
/ 19 ноября 2010

В C рассмотрим следующие строковые массивы «inline»:

char *string1 = "I'm a literal!";
char *string2 = malloc((strlen(string1) + 1) * sizeof(char));
//Do some string copying
...
char string3[] = {'a','b','c','\0'};
char *stringArray[] = {string1, string2, string3};

Будет ли stringArray просто содержать копию каждого из трех указателей?стек?

Ответы [ 3 ]

9 голосов
/ 19 ноября 2010

stringArray выделяется в стеке, каждый его элемент является указателем на char.Если быть более точным: указатель

  • string1 находится в стеке, его значение является адресом первого символа строки только для чтения в сегменте данных
  • string2 указатель на стек, его значение - адрес блока памяти, выделенного в куче
  • string3 - массив, занимающий 4 * sizeof(char) байт в стеке
  • stringArrayмассив, который занимает 3 * sizeof(char *) байт в стеке.
1 голос
/ 19 ноября 2010

Да (он содержит копии указателей (см. Далее)) и да (массив находится в стеке).

(string3 это не указатель, а массив).

0 голосов
/ 19 ноября 2010

Предполагая, что ваш фрагмент кода является частью функции (и похоже, что это так, поскольку вы «выполняете некоторое копирование строки»), тогда да, все, кроме хранилища для string2 (так как это malloc () ed), будутв стеке.

...