2017-01-20 9 views
0

Я пытаюсь понять, как работает malloc. Я выполнил программу, которая ищет самый большой элемент в одномерном массиве int.Как использовать функцию malloc для функции?

Это код.

#include <stdlib.h> 
#include <stdio.h> 

void largest_element(int *nbr) 
{ 
    int i; 
    int n; 
    int m; 

    i = 1; 

    nbr = (int*)malloc(sizeof(nbr) + 8); 

    while (i < 8) 
    { 
     if (*nbr < *(nbr + i)) 
      *nbr = *(nbr + i); 
     i++; 
    } 
    printf("%d ", *nbr); 
} 

int main(void) 
{ 
    int i; 
    int tab[8] = {11, 2, 4, 5, 9, 7, 8, 1}; 
    int n = sizeof(tab)/sizeof(int); 

    i = 0; 

    largest_element(&tab[8]); 

    return(0); 
} 

Программа работает без malloc, но как я могу заставить ее работать с malloc? Что я сделал не так, и почему мой код только дает мне номера мусора?

+3

В этом коде нет причин для вызова 'malloc'. Вы читаете из массива, не изменяя его. Кроме того, вы должны проходить в 'tab', а не' & tab [8] '. – dbush

+0

Я пытаюсь понять, как работает malloc и как разрешить это упражнение с помощью malloc. –

+0

Затем, пожалуйста, предоставьте определение проблемы. – szpanczyk

ответ

3

Я думаю, что вы потерялись с указателями и массивами, поэтому вы не можете правильно понимать malloc (не обижайтесь, каждый, кто учится C, совершает ту же ошибку).

Давайте рассмотрим вашу основную функцию. Когда вы запускаете:

int tab[8] = {11, 2, 4, 5, 9, 7, 8, 1}; 

Вы статически выделяете массив из 8 целых чисел, и вы заполняете его своими номерами.

Динамический эквивалент будет:

int* tab = malloc(sizeof(int) * 8); 
tab[0] = 11; 
tab[1] = 2; 
/// Etc... 
tab[7] = 1; 

Первая вещь: первый элемент массива имеет индекс 0. Таким образом, в вашей largest_element функции, i должны быть инициализированы в 0 вместо 1.

Причина в том, что когда вы имеете дело с массивом, вы имеете дело с указателями. В вашем случае tab является указателем на первый элемент массива. Итак, когда вы делаете tab[3], вы получаете четвертый элемент вашего массива.

Второй вещь: когда вы делаете:

largest_element(&tab[8]); 

Вы присылаете к вашей функции восьмого элемента после того, как начало вашего массива. Проблема в том, что вы не владеете этой областью памяти! У вас есть память только до вкладки [7].

Если вы хотите, чтобы отправить полный массив вашей функции, просто используйте:

largest_element(tab); 

Теперь давайте поговорим о вашей largest_element функции.

  1. Вам не нужно вызывать таНос здесь, так как память уже выделена
  2. Когда вы *nbr = *(nbr + i); изменить значение первого элемента вашего массива. Я думаю, вы хотели сделать m = *(nbr + i);, не так ли.
  3. Почему вы не используете nbr[i] вместо *(nbr + i)?

Правильная реализация этой функции будет что-то вроде (не проверено):

void largest_element(int *nbr) 
{ 
    int i = 0; 
    int max = 0; 

    while (i < 8) 
    { 
     if (max < nbr[i]) 
      max = nbr[i]; 
     i++; 
    } 

    printf("%d ", m); 
} 

Последняя вещь, с помощью таНос связаны с использованием функции free, чтобы освободить память, когда вы больше не нужно ,

+0

FYI - не выдавать результат 'Xalloc()' – KevinDTimm

+0

Я полностью соглашайтесь с вами и ваши права. Я сделал ту же функцию без malloc, и она сработала. Просто, что я хочу точно знать, как использовать malloc. В любом случае, спасибо. –

0

Что я сделал не так, и почему мой код только дает мне номера мусора?

В largest_element(int *nbr)nbr указывает на массив tab в main (по крайней мере, если вы называете это так: largest_element(tab); вместо как это largest_element(&tab[8]);

Тогда вы называете nbr = (int*)malloc(sizeof(nbr) + 8); Теперь nbr указывает на какой-то выделенной памяти, которая не была инициализируется и содержит значения мусора. Теперь, если вы читаете из этой памяти, это нормально, что вы получаете значения мусора.

Для этой проблемы вам просто не нужно malloc, так же как и вы, для этой задачи нужны функции с плавающей запятой или связанные с файловой системой функции.

 Смежные вопросы

  • Нет связанных вопросов^_^