Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

в массиве содержатся разные элементы

#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; }

Комментариев нет:

Отправить комментарий