Программа на C: обновление массива беззнаковых указателей с помощью функции
У меня есть функция для обновления unsigned char*
и не могу найти где моя ошибка. Я не уверен, нужно ли мне выделять память или я куда-то указываю на неправильное пространство памяти. Я пытался следовать той же структуре, как и здесь, но не добился успеха unsigned char
,
Мой код до сих пор:
#include <stdio.h>
void changeArray(unsigned char **arr)
{
unsigned char ptr[3] = {100, 101, 102};
*arr = ptr;
printf("%d\n", **(arr+0)); // This prints out the correct value of 100
}
int main(int argc, const char* argv[])
{
int i = 0;
unsigned char *blah;
unsigned char ptr2[3] = {103, 104, 105};
blah = ptr2;
printf("Blah is: \n");
for (i = 0; i < 3; i++) {
printf("%d,",*(blah+i)); //This prints out 103,104,105
}
changeArray(&blah);
printf("Blah is now: \n");
for (i = 0; i < 3; i++) {
printf("%d,", *(blah +i)); //This prints out 0,0,0
}
return 0;
}
Любая помощь в определении того, как правильно получить доступ к значениям, установленным в функции changeArray(), будет принята с благодарностью.
2 ответа
С этим *arr = ptr;
вы храните указатель на переменную с автоматическим хранением. Поведение не определено.
Вы можете динамически размещать и возвращать указатель таким образом:
void changeArray(unsigned char **arr)
{
unsigned char ptr[3] = {100, 101, 102};
unsigned char *p = malloc(sizeof ptr);
memcpy(p, ptr, sizeof ptr);
*arr = p;
printf("%d\n", **(arr+0)); // This prints out the correct value of 100
}
Вы также должны сделать проверку ошибок, если malloc
не удалось и не забудьте free
выделенная память после использования в main
,
Проблема здесь в том, ptr
является локальным для changeArray()
функция. Таким образом, как только функция завершает выполнение, не существует ptr
, Следовательно, как только вы назначаете ptr
в *arr
*arr = ptr;
а также changeArray()
исполнение заканчивается, доступ blah
в main()
теперь будет вызывать неопределенное поведение.
FWIW, вам не нужно передавать адрес blah
вам не нужен указатель на указатель вообще. blah
это уже указатель, который вы можете передать changeArray()
изменить содержимое области памяти, на которую он указывает. Вы можете сделать что-то вроде
void changeArray(unsigned char *arr)
{
for (int i = 0; i < 3; i ++)
arr[i] = 100+i;
}
и называть это как
changeArray(blah);