0
#include<stdio.h>

typedef struct telephone
{
    char *name;
    int number;
} TELEPHONE;

int main()
{
    //TELEPHONE index;
    TELEPHONE *ptr_myindex;
    ptr_myindex = (TELEPHONE*)malloc(sizeof(TELEPHONE)); 
    //ptr_myindex = &index;

    ptr_myindex->name = "Jane Doe";
    ptr_myindex->number = 12345;
    printf("Name: %s\n", ptr_myindex->name);
    printf("Telephone number: %d\n", ptr_myindex->number);

    free(ptr_myindex);

    return 0;
}

当我编译它时,它输出的结果与我不动态分配指向结构的指针时的结果相同,而是使用我的代码中已被注释掉的部分。为什么会这样?

4

2 回答 2

3

当您声明:

TELEPHONE index

编译器知道结构TELEPHONE是什么类型,因此它分配该结构所需的内存。

例如:

int a = 5;
int *p = &a;

这是完美的。但是如果我们想在没有 的情况下达到同样的效果int a = 5,我们应该执行以下操作:

int *p;
p = (int*)malloc(sizeof(int));
*p = 5;

硬是有区别的。第一个代码在 中分配变量stack,而第二个代码在中分配变量heap。但是在第二种情况下,在 之前没有为结构分配空间malloc,唯一分配的空间是指针本身(不需要与结构本身相同的空间)。

于 2012-09-22T16:29:01.200 回答
2

您的两个版本的代码执行以下操作:

  1. 在堆上分配结构。
  2. 将结构分配为局部变量。

这些选项在此程序中可以互换。分配给结构然后打印的代码不关心结构是堆分配的还是局部变量。

于 2012-09-22T16:28:40.047 回答