Смущены указателями? - PullRequest
2 голосов
/ 21 мая 2011

Я пытаюсь записать ответ в переменную и не могу понять, как это сделать.

Это не работает - портит память, но нет ошибок защиты:

for (int i = 0; i < 20; i++) {
    list[i] = 'a';
}

То же самое с этим - память облажалась:

for (int i = 0; i < 20; i++) {
    *(((int*)(list))+i) = 'a';
}
//I don't think this is a string issues as this doesn't help:
//*(((int*)(list))+20) = '\0';

Это вызывает ошибку шины:

for (int i = 0; i < 20; i++) {
    *list[i] = 'a';
}

Это работает как нужно:

*list = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

Что я делаю не так?

P.S. list равно char**.

Ответы [ 4 ]

2 голосов
/ 21 мая 2011

В C указатель может использоваться для представления массива, а одна строка - это массив char, или, другими словами, char *.Это означает, что char ** является массивом строк.Поэтому, если вы хотите поместить символы в первую строку (при условии, что память уже выделена для нее), вы должны использовать list[0][i] = 'a'; в первом цикле, то есть поместить 'a' в положение i из 0th string.

Еще один способ интерпретации char ** (который, я подозреваю, тот, который вы должны использовать) состоит в том, что это указатель, который указывает на указатель, указывающий на массивchar.В этом случае вы можете использовать «внешний» указатель, чтобы изменить то, на что указывает внутренний указатель;это можно использовать, чтобы сначала выделить строку, а затем записать в нее:

*list = malloc(21); // Allocate 21 bytes and make the pointer that 'list' points to refer to that memory
for (int i = 0; i < 20; i++) {
    (*list)[i] = 'a';
}
(*list)[20] = '\0'; // Also, you need the null terminator at the end of the string

В памяти это выглядит так:

list ---> (another pointer) ---> |a|a|a|a|a|a|...|a|a|\0|
1 голос
/ 21 мая 2011
char** list

Это не «массив байтов», это «указатель на указатель на символ», который вы можете рассматривать как «список списков символов».Кроме того, если вы определяете это таким образом, вам нужно выделять достаточно памяти для хранения данных.

Когда вы пишете:

list[i] = 'a';

Это портит память, потому что вы помещаете символ 'a'в месте, указанном для хранения указателя.На самом деле в большинстве компиляторов символьные литералы имеют тип int, так что вы на самом деле храните форму int в виде «a» в качестве указателя на область памяти, которая может вызвать все виды повреждения памяти.

Если вы хотите, чтобы «список» находился в стеке, определите его как:

char list[20]

Если вы хотите, чтобы «список» был в куче, определите его как:

char* list;
list = malloc(sizeof(char) * 20);

В любом случае обращайтесь к нему как:

list[i]

Также небезопасно предполагать, что размер int эквивалентен размеру указателя, как вы это сделали во втором примере.По крайней мере, я думаю, это то, что ты пытался сделать.

Кроме того, если вы храните необработанные байты из потока данных или что-то в этом роде, вам, вероятно, следует использовать «unsigned char», а не «char», и для большей безопасности используйте «int8_t», поскольку вы не всегда можете гарантировать, что'char' - это 8 бит, хотя он используется на большинстве платформ.

1 голос
/ 21 мая 2011

Так как вам нужен массив байтов, то char** неверно - это указатель на указатель на char.Вы хотите char* для массива, но если бы он был фиксированной длины, я бы объявил его как char list[20].

Кажется, что вы хотите написать что-то вроде этого:

char list[20];
for (int i = 0; i < 20; i++) {
    list[i] = 'a';
}

Или, если вы хотите выделить кучу, используйте

char *list = malloc(20);

Поскольку мы ограничены догадками, я думаю, что вы хотели сказать, что *list - это массив байтов.В этом случае код будет выглядеть так:

char **list = get_list_from_somewhere();
*list = malloc(20);
for (int i = 0; i < 20; i++) {
    *list[i] = 'a';
}
0 голосов
/ 21 мая 2011

Как вы инициализировали свой list?

char** list;

не работает, в этом случае вам понадобится что-то вроде

char* list[20];

или динамически выделенное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...