Хранение адреса строки в массиве строк - PullRequest
0 голосов
/ 27 апреля 2011

У меня возникли проблемы с сохранением адреса определенного значения в массиве строк для указателя и его распечаткой.Прошу прощения за неправильные имена переменных, они только для примера.

char **code;                      // code is an array of 100 strings of length 8 characters
code = malloc (100*sizeof(*code));
for (i=0; i<100; i++) {
    code[i]=malloc(8*sizeof(**code));
}

char **r;                        // r is an array of 16 strings of 32 characters
r = malloc (16*sizeof(*r));
for (i = 0; i < 16; i++)
    r[i] = malloc(32*sizeof(**r));

char *a;                         // a is a pointer to a string

a = (char *) &r[13];             // point a to value at r[13]

*a = (char *)&code[100];         // trying to assign the value of r[13] to the address of code[100]   

printf("Code 100 Add: %p a Val: %i\n", &code[100], *sp);  // trying to check values.

Я пытаюсь присвоить значение a (которое указывает на r [13], поэтому назначьте значение r [13]) к значению адреса строки в коде [100].Даже строка из 32 символов - лучший способ сделать это?

Цените любую помощь, Гарет

Ответы [ 6 ]

3 голосов
/ 27 апреля 2011
a = (char *) &r[13];             // point a to value at r[13]

Включите предупреждения вашего компилятора и обратите внимание на то, что компилятор сообщит вам при удалении этого приведения. Тебе не нужны никакие приведения в этом коде.

Тип r равен char**, поэтому тип r[13] равен char*, а тип &r[13] равен char**, который вы назначаете для char*.

P.s., В следующий раз, пожалуйста, укажите также полученную ошибку и ожидаемую.

0 голосов
/ 27 апреля 2011

Я не хочу задавать вопрос во время чьего-либо вопроса ... но разве не должны быть вызовы setup / malloc массива char быть чем-то вроде этого?Разве он не выделяет слишком много с помощью sizeof (** code)?И потом ... если это для 8 символов ... разве мы не хотим, чтобы 9 освободили место для '\ 0'?

char **code;                      // code is an array of 100 strings of length 8 characters
code = (char**) malloc (100*sizeof(char*));
for (i=0; i<100; i++) {
   code[i] = (char*)malloc(9*sizeof(char));
}
0 голосов
/ 27 апреля 2011

При определении char *a; *a в левой части назначения становится lvalue типа char. Вы можете присваивать значения указателя там как целые числа, как в квадратном колышке в круглом отверстии, хотя это не имеет особого смысла. Для копирования строк используйте str[nl]cpy(3).

0 голосов
/ 27 апреля 2011

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

0 голосов
/ 27 апреля 2011

&r[13] не является указателем на символ.

Вам просто нужно

r[13] = code[100]

Я согласен с Фредериком в том, что вы должны быть осторожны при free() распределении памяти, поскольку теперь у вас есть два указателя, указывающие на один и тот же блок памяти. Если вы предпочитаете следовать его советам, попробуйте следующее:

strncpy(r[13], code[100], 8)
0 голосов
/ 27 апреля 2011

Чтобы назначить строку, используйте strncpy. Не копируйте значение указателя напрямую, потому что таким образом вы дважды освободите его (среди прочих проблем).

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