2013-02-12 2 views
0

Я ПОНИМАЮ, ЧТО ЭТО ПРОГРАММА НЕ РАСПРОСТРАНЯЕТСЯ ДОПОЛНИТЕЛЬНОЙ ПАМЯТЬЮ.Нужно объяснять переменную Word2

Что мне нужно, это описание объяснения того, что происходит при выполнении этого кода.

Я положил «Поскольку выделено только 4 пробела, ему не хватает места, чтобы он вызывал ошибку». Что мне не кажется правильным. Благодарю.

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

int main() 
{ 
    char word1[20]; 
    char *word2; 

    word2 = (char*)malloc(sizeof(char)*20); 

    printf("Sizeof word 1: %d\n", sizeof (word1)); //This line outputs 20 
    printf("Sizeof word 2: %d\n", sizeof (word2)); //This line outputs 4 
                //before & after I used malloc 
    strcpy(word1, "string number 1"); 
    strcpy(word2, "string number 2"); <---- What is this doing 

    printf("%s\n", word1); 
    printf("%s\n", word2); 
} 

ответ

2

SizeOf (word2) возвращает 4, потому что размер указателя

char *word2; 

является указателем и есть 0 байт, выделенных для него (не 4, как вы упомянули)

SizeOf (слово1) возвращает 20 becuase, что является размер массива

char word1[20] 

представляет собой массив, и есть 20 байт, зарезервированных для него

+0

. Еще один вопрос ... действительно ли код выделяет память точно так же для word1/word2? Добавлено в динамическое распределение. – juice

+0

Не [точно] (http://stackoverflow.com/a/8385488/1944441) –

+0

Прекрасное спасибо. – juice

4

word2 - неинициализированный указатель. Запись данных в него имеет неопределенные последствия, но, вероятно, произойдет сбой. Вы должны выделить память для нее в стеке (как для word1) или динамически, используя malloc.

char *word2 = malloc(20); // arbitrary value. could use strlen(some_str)+1 also 
strcpy(word2, "string number 2"); // works now 

или для Posix систем

char *word2 = strdup("string number 2"); 

В любом случае, убедитесь, что позже назовет free, чтобы вернуть эту память в системе.

Обратите внимание, что даже после того, как выделение памяти, sizeof(word2) останется 4. Это потому, что word2 имеет тип char* так sizeof сообщает размер char*, а не памяти он указывает.

+0

Хорошо еще один вопрос ... действительно ли код выделяет память точно так же для word1/word2? Добавлено в динамическое распределение. – juice

+0

Извините, я не уверен, что понимаю. В вашем текущем коде как 'word1', так и' word2' выделяются в стеке и будут автоматически исправлены, когда они выйдут из области видимости. Если вы используете 'malloc' (или любую промежуточную функцию, которая его использует), выделенная память останется выделенной до тех пор, пока вы не назовете' free'. Если это не ответит на ваш вопрос, можете ли вы попробовать повторить его, пожалуйста? – simonc

+0

В основном, когда я выделяю word1 в размер 20, это то же самое, что динамически выделяя * word2 на 20? – juice

0

В вашей программе word2 будет иметь некоторое предыдущее значение или, вероятно, значение нежелательной почты. Когда вы выполняете strcpy(word2, "string number 2");, вы пытаетесь записать в то место, к которому у вас нет доступа, и, следовательно, ваша программа вылетает из строя. Таким образом, вам необходимо выделить достаточную память, в которую может записываться ваша программа.

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

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