#c #массивы #указатели
Вот код: int *p; // так как в функцию указатель в таком виде передать нельзя: компилятор заругается, то: p = (int*)malloc(sizeof(int)); // в функции я переопределю его размер через realloc func(p); for (i = 0; i < count; i++) printf("%d ", p[i]); // возвращает мусор /* если из функции делать вывод, то в консоль выводятся корректные значения */ Помогите понять, в чём тут дело ? Прототип функции func: void func(int *arr); Делать int * не хочу пока что: хочу понять, что тут не так...
Ответы
Ответ 1
Итак, у вас есть указатель int* p; и вы хотите инициализировать его через вызов функции. Можно сделать так: void func(int** inPtr){ int* tmp = (int*)malloc(0x100); *inPtr = tmp; //(*inPtr)[2] = 0x02;//пишем 3-й элемент } void main(void){ int* p; func(&p); //printf("0x%X\n", p[2]);//читаем 3-й элемент } func принимает указатель на указатель на int, то есть адрес указателя на int. В main мы через ссылку получили адрес нашего указателя и передали его в функцию. В функции мы через разыменование из адреса получили сам указатель и записали в него выделенный буфер. Пляски с tmp нужны, чтобы в отладчике можно было посмотреть реальный адрес выделенного буфера и сравнить его с тем, что будет в p после выполнения funс()Ответ 2
Я не очень понял, почему нельзя передать указатель в функцию и что за мусор получается, по этому попробую просто ответить примером: #include#include #define COUNT 15 void func(int *arg) { if((arg = (int*)malloc(sizeof(int) * COUNT)) == NULL) printf("allocation error\n"); } int main() { int *p, i; // почему в таком виде нельзя передать? func(p); // если в func() произошел allocation error, будет ошибка, // т.к. мы ничего не узнаем об этом // меняем мусор на что-то осмысленное for (i = 0; i < COUNT; i++) *(p + i) = i; // выводим массив for (i = 0; i < COUNT; i++) printf("%d ", p[i]); printf("\n"); return 0; }
Комментариев нет:
Отправить комментарий