Распределение памяти в c проблемой - PullRequest
1 голос
/ 18 августа 2011

Я близок к завершению вводной книги Майка МакГрата «Программирование на С в простых шагах» под названием «Программирование на Си простым способом».Я думаю, что после этой книги мне еще многое предстоит узнать по внешнему виду.В любом случае, я работаю с распределением памяти, и я написал эту демонстрационную программу, но она закрылась с ошибками при попытке ее запустить:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i, *arr;

    arr = calloc(5, sizeof(int));
    if(arr!=NULL)
    {
        printf("Enter 5 integers, seperated by a space:");
        for(i=0; i<5; i++) scanf("%d", &arr[i]);
        printf("Adding more space...\n");
        arr = realloc(8, sizeof(int));
        printf("Enter 3 more integers seperated by a space:");
        for(i=5; i<8; i++) scanf("%d", &arr[i]);
        printf("Thanks.\nYour 8 entries were: ");
        for(i=0; i<8; i++) printf("%d, ", arr[i]);
        printf("\n");
        free(arr);
        return 0;
        }
    else {printf("!!! INSUFFICIENT MEMORY !!!\n"); return 1; }
}

Предупреждение:

|13|warning: passing argument 1 of 'realloc' makes pointer from integer without a cast|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\stdlib.h|365|note: expected 'void *' but argument is of type 'int'|
||=== Build finished: 0 errors, 1 warnings ===|

ПолучившийсяКомпиляция запрашивает 5 целых чисел и печатает «Добавление дополнительного пространства ...», после чего программа завершается, вместо того, чтобы запрашивать дополнительные три целых числа и печатать ввод.

Любая помощь была бы хороша.:) Спасибо!

Ответы [ 6 ]

7 голосов
/ 18 августа 2011

Вы не используете realloc так, как должны:

/* 8 is not valid here. You need to pass the previous pointer. */
arr = realloc(8, sizeof(int));

Попытка:

tmp = realloc(arr, 8 * sizeof(*arr));
if (NULL != tmp)
    arr = tmp;

Кроме того, ваша программа выглядит действительно переполненной, что затрудняет ее чтение. Может, время от времени оставлять пустую строку?

1 голос
/ 18 августа 2011

Вам нужно передать указатель на память, размер которой вы хотите изменить:

tmp = realloc(arr, 8 * sizeof(int));
if (NULL != tmp)    
   arr = tmp;
0 голосов
/ 19 августа 2011

На первом этапе Вы должны научиться использовать realloc. Причиной первого предупреждения является ваше видение на экране

passing argument 1 of 'realloc' makes pointer from integer without a cast
 int i, *arr;          
 arr = calloc(5, sizeof(int)); \\ Not the right way 
 arr = (int *) calloc (5,sizeof(int)); \\ makes sense

Вы должны набрать указатель, возвращенный Calloc, прежде чем он будет назначен. Вот почему вы получили предупреждение без приведения. Примечание

char *arr ; arr = (char *) realloc (5,sizeof(char))
double *char: arr =(double *) realloc (5,sizeof(double))

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

и насколько мне известно

for(i=0; i<5; i++) scanf("%d", &arr[i]);  \\ this is not the way to use pointers
this would be mostly used in arrays !

Это способ использовать указатели

      *(arr+1) or *(arr+any_variable) \\ 

и помните, что, когда вы определяете arr как целочисленный указатель, он увеличивает свой адрес на 2

example arr pointing to 3000 memory location after *(arr+1)
points to 3002 location and if arr pointer is ,char *arr, then
arr pointing to 3000 then *(arr +1 ) now it will point to 3001 location
same for double by 8 and for float 4 .

1 не означает 1, это означает увеличение его на размер указателя, указывающего на. ну я никогда не замечал такой синтаксис для указателей

     &arr[i]

Если это также способ использования указателей, то я рад принять его, я научился другому способу доступа к указателям

   but think of using these *(arr+i) mostly 

ну вы также можете использовать

 (int *) calloc(5, sizeof(int))
 \\ the number of bytes allocated by it is 5 * sizeof(int) = 5*2 =10 

Спасибо.

и, пожалуйста, пройдите http://www.cplusplus.com/reference/clibrary/cstdlib/calloc/ и этот сайт действительно многообещающий сайт для начинающих. Надеюсь, вам понравится, и любые сомнения, которые мы здесь, чтобы помочь вам

0 голосов
/ 18 августа 2011

Вы используете realloc неправильно.

    // ptr: Pointer to a memory block previously allocated with malloc, calloc or
    // realloc to be reallocated.
    void * realloc ( void * ptr, size_t size );

Вы должны использовать realloc(arr, 8 * sizeof(int));

0 голосов
/ 18 августа 2011

Посмотрите, как работает realloc - вам нужно передать исходный указатель:

int * tmp = realloc(arr, 8 * sizeof(int));
if (tmp)
{
  arr = tmp;
}
else // Error!
0 голосов
/ 18 августа 2011

Первый аргумент realloc должен быть ранее выделенным указателем

...