2014-12-22 2 views
-1

В моей программе calloc() не работает размером более 38, но с меньшим, чем этот номер, он отлично работает. В этом случае я хочу выделить 128 из int и выпустить его впоследствии.calloc не работает для больших чисел

Что случилось?

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

int main() 
{ 
    int *a; 
    int *x; 
    x = malloc(512/sizeof(int)); 
    a = x; 
    int n = (512/sizeof(int)); 
    int i; 
    for (i = 0; i < n; i++) 
    { 
     printf("Address of x[%d] = %x\n", i, x); 
     printf("Value of x[%d] = %d\n", i, *x); 
     x++; 
    } 
    free(a); 
    int *y = (int *)malloc(512/sizeof(int)); 
    a = y; 
    for (i = 0; i < n; i++) 
    { 
     printf("Address of y[%d] = %x\n", i, y); 
     printf("Value of y[%d] = %d\n", i, *y); 
     y++; 
     *y = i + 1; 
    } 
    free(a); 
    int *z = (int *)calloc(38, sizeof(int)); 
    a = z; 
    for (i = 0; i < 38; i++) 
    { 
     printf("Address of z[%d] = %x\n", i, z); 
     printf("Value of z[%d] = %d\n", i, *z); 
     z++; 
    } 
    free(a); 
    return 0; 
} 
+0

'printf (" Значение y [% d] =% d \ n ", i, * y);' '* y' неинициализировано. –

+3

if 'n = 512/sizeof (int)' then 'malloc (512/sizeof (int))' неверно, он должен быть 'malloc (512)'. –

+2

Опишите эту ошибку. Также рассмотрите возможность удаления нерелевантного кода из вашего примера. Моя ставка заключается в том, что при этом проблема уже исчезнет. – 5gon12eder

ответ

3

Первая проблема, вы не инициализировать значения x или y и еще вы пытаетесь напечатать их, в то время как другая проблема, будучи более важным является:

n = 512/sizeof(int) 

, а затем вы таНос

x = malloc(512/sizeof(int)) 

вы должны malloc таким образом

x = malloc(n*sizeof(int)) 

, который дает

x = malloc(512) 

, но так как вы хотите выделить 128 of int, это понятнее сделать

n = 128; 
x = malloc(n * sizeof(int)); 

это фиксированный код

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

int main() 
{ 
    int *a; 
    int *x; 
    x = malloc (512); 
    a = x; 
    int n = (512/sizeof(int)); 
    int i; 
    for (i = 0; i < n; i++) 
    { 
     *x = i; /* intialize the value of x[i] */ 
     printf("Address of x[%d] = %p\n", i, x); 
     printf("Value of x[%d] = %d\n", i, *x); 
     x++; 
    } 
    free(a); 

    int *y = malloc(512); 
    a = y; 
    for (i = 0; i < n; i++) 
    { 
     *y = i+1; /* initialize the value of y[i] */ 
     printf("Address of y[%d] = %p\n", i, y); 
     printf("Value of y[%d] = %d\n", i, *y); 
     /* *y = i+1; move this before the printf */ 
     y++; 
    } 
    free(a); 
    int *z = calloc(38, sizeof(int)); 
    a = z; 
    for (i = 0; i < 38; i++) 
    { 
     printf("Address of z[%d] = %p\n", i, z); 
     printf("Value of z[%d] = %d\n", i, *z); 
     z++; 
    } 
    free(a); 
    return 0; 
} 

Вы всегда должны проверить результат malloc возвращает NULL при сбое. Если он возвращает NULL, и вы не проверяете, вы бы разыменовали указатель NULL, что не очень хорошая идея.

Ирония заключается в том, что единственная часть вашего кода, которая была на самом деле правильная, составляла часть calloc, за исключением того, что она не проверяла возвращаемое значение.

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