2014-09-02 6 views
1

Эта программа рушится. Скажите, пожалуйста, что с этим не так. Когда я использую массив вместо указателя, например Name[12], в структуре он не падает. Я предполагаю, что есть некоторая проблема в распределении динамической памяти. Помоги пожалуйста.Почему эта программа рушится, я ошибочно выделил память

#include <stdio.h> 

struct struct_tag 
{ 
    int number; 
    char *Name; 
} struct_name; 


main() 
{ 
    struct_name.number = 34; 

    char *Name = (char *) malloc(sizeof(char)); 
    strcpy(struct_name.Name,"A"); 

    printf("%d", struct_name.number); 
} 
+3

[Пожалуйста, не бросайте возвращаемое значение 'таНос()' в C] (http://stackoverflow.com/questions/605845/do -i-монолитно-заместитель на результат из-таНоса). – unwind

+3

'char * Name' - это не то же самое, что' struct_name.Name'. – DCoder

+2

@unwind sir мой учитель сказал мне malloc return void pointer его важно бросить его сказать, что должно вернуть значение – user3995169

ответ

4

Вы выделения одного символа:

char *Name = (char *) malloc(sizeof(char)); 

И тогда никогда не использует эту память для чего-либо. Вы, разумеется, хотели выделить память для struct_name.Name. Но даже если вы сделали это, вы затем заполнить его с два символов ('a' и '\0'):

strcpy(struct_name.Name,"A"); 

, который будет вызывать совершенно другую ошибку.

Вы хотите сказать:

struct_name.Name = malloc(2); 

С (а) вы не должны отбрасывать результат malloc() и (б) sizeof(char) всегда 1 и (с) Вам нужен номер для 0 в конец вашей строки.

1

внимательно посмотрите внимательно.

char *Name = (char *) malloc(sizeof(char)); 
strcpy(struct_name.Name,"A"); 

Hare за то, что вы выделили память (char *Name), и в котором вы скопировали строку (struct_name.Name)?

здесь Вы не выделили памяти для struct_name.Name. Также вы выделили память для одного символа, и вы попытались скопировать два символа ('A' и '\ 0').

Это должно быть

struct_name.Name = malloc(2); 
2

Для ошибок:

  • Вы направляете Memeory для *Name однако вы не выделяя памяти struct_name.Name. Так что первым делом нужно выделить память для struct_name.Name

  • Как вы уже знаете, что вы будете хранить "A" в
    struct_name.Name следует выделить память для 2 гольца. ("A" струнный т.е. «A» и «\ 0')

для предупреждения:

  • Если вы хотите использовать strcpy функции включают string.h в вашем коде.

  • Также, если вы используете malloc, включите stdlib.h в свой код.

Попробуйте этот фиксированный код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
struct struct_tag 
{ 
    int number; 
    char *Name; 
}struct_name; 

int main() 
{ 
    struct_name.number = 34; 
    struct_name.Name = malloc(sizeof(char)*2); // As you will store "A" 
    strcpy(struct_name.Name,"A"); 

    printf("%d \t", struct_name.number); 
    printf("%s \n", struct_name.Name); 

    return 0; 
} 
+0

OP спросил «Пожалуйста, скажите мне, что случилось с этой программой». – usr2564301

+0

Я сделал комментарий, где OP ошибается. – user1336087

+0

@Jongware: Я также удалил все предупреждение из кода OP.Пожалуйста, объясните, почему вы отклоняете мой ответ? – user1336087

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