2013-03-08 4 views
1

Ниже приведен фрагмент кода:Распределение памяти с malloc?

int main(void) { 

    char sizing[] = "manshcanshcnams cndhan sndhcna snshans"; 
    char *xyz = malloc(sizeof(char)); 
    printf("%ld\n",sizeof(xyz)); 
    xyz = sizing; // IT SHOULD FAIL HERE 
    printf("Fail %s\n",xyz); 
    return 0; 

}

Как вы можете видеть, что я пытаюсь присвоить больше памяти для АБВ то, что он может держать. Но выход не подводит. Это неопределенное поведение?

ответ

3

Вы не можете скопировать строки с =. xyz = sizing просто изменяет переменную xyz так, чтобы она указывала на массив sizing, вместо того, чтобы указывать на память, которую вы malloced.

Итак, ваша память просочилась, но нет неопределенного поведения (кроме того, что вы забыли включить <stdio.h> и <stdlib.h>).

+0

Можем ли мы хранить память xyz тогда, для чего она предназначена? –

+0

'xyz' не хранит память. Это указатель. Это указывает на память. –

+0

@UnderDog попробуйте использовать код, заменяющий 'char * xyz = malloc (sizeof (char));' с 'char * xyz;'. – 2013-03-08 00:24:08

1

Все, что вы делаете, говоря указатель хуг, чтобы указать на адрес памяти, связанной с проклейки. Нет причин, чтобы это не получилось.

-1

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

Кроме того, не все незаконные операции с памятью приводит к ошибке, например (код отредактирован 2013-03-08 основан на наблюдении Kludas, что предыдущая версия не будет компилировать):

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

int main(void) 
{ 
    char myString[4]; 
    strcpy(myString, "abcdefghijklmnopqrstuvwxyz"); /* This overflows the buffer */ 
                /* but MIGHT NOT cause an */ 
                /* immediate crash!   */ 
    printf("myString = [%s]\n", myString); 
    return 0; 
} 

Это может -or-may-not-not-error, но это, конечно, незаконно, потому что я пишу 26 символов в массив, который должен содержать только 4 элемента (три символа плюс завершающий NULL).

+0

Это даже не компилируется. Вы пытаетесь назначить указатель на строковый литерал для массива. – Kludas

+0

D'oh! Благодаря; исправлено. – neilr8133

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