在C中,我的程序浪费了多少内存?

时间:2011-05-25 00:58:28

标签: c

我想知道,例如,我有一个包含三个成员的结构......比如:

struct Somethings { 
     int member1;
     int member2;
     char *member3;
} 

我这样做:

  
struct Something thing = {1, 2, "I'm a sentence..."};
 

当我运行程序时,我将在内存中拥有什么?我的意思是,我是否只有一个带有这些值的'thing'结构,或者,我会在代码本身中使用这个结构和另一个这些值的副本吗?我认为编译器足够聪明,在结构中只有这些值的一个副本,对吗?有人知道看到它的任何命令吗?我不太清楚调试......

感谢。

3 个答案:

答案 0 :(得分:2)

在实践中,您的问题的答案取决于您声明该行的确切位置:

struct Something thing = {1, 2, "I'm a sentence..."};

在文件范围内,这会声明thing 静态存储持续时间,这意味着它从程序启动到程序终止。在这种情况下,在程序执行时,磁盘上的编译程序和内存中很可能只有一个数据的物理副本。

或者,在函数中,这将使用自动存储持续时间声明thing,这意味着它仅在函数返回之前存在。在这种情况下,编译程序中仍然可能只有一个数据的物理副本,但是在程序执行时,每次达到thing的声明时都会创建第二个临时副本,并且每次该函数返回时都被销毁。 (请注意,这适用于12和存储在thing.member3中的指针值,但不适用于字符串"I'm a sentence..."本身 - 仍然只有一个副本)。如果以递归方式调用该函数,则将生成第三,第四等临时数据副本。

答案 1 :(得分:0)

该语句将导致内存中的某个字节序列看起来像这样(假设big-endian处理器并且为了简单起见而忽略structure padding)。

Location    Contents
   N          0x00    // highest byte of 1
   N+1        0x00   
   N+2        0x00
   N+3        0x01    // lowest byte of 1
   N+4        0x00    // highest byte of 2
   N+5        0x00
   N+6        0x00
   N+7        0x02    // loweest byte of 2
   N+8        0xLL    // Highest byte of pointer to pointing to location 0xLLMMNNPP
   N+9        0xMM    
   N+10       0xNN    
   N+11       0xPP    // Lowest byte of pointer pointing to 0xLLMMNNPP

然后在位置0xLLMMNNPP,您将获得字符串数据:

   Location     Contents
   0xLLMMNNPP    0x49  // I
   0xLLMMNNPP+1  0x27  // '
   0xLLMMNNPP+2  0x6D  // m
   [and so on]
   0xLLMMNNPP+15 0x00  // the end-of-string terminator

在你的程序中,结构根本不存在。该结构仅定义数据如何在内存中布局。编译器将记住该定义,以便在给定结构数据位于内存中的起始位置的情况下知道在何处查找结构的各个部分。

答案 2 :(得分:0)

struct Somethings的定义是告诉编译器您创建的新类型的方式。 struct Something thing是您创建该类型对象的方式。

当程序运行时,将创建所有对象,并且在退出其范围后,它们都将被销毁。对于使用动态分配创建的对象,由您或程序退出,可以销毁对象并释放它们所拥有的内存。

如果您查看C程序的内存布局以了解程序的运行时脚印,这应该会有所帮助。

并且,您在问题中给出的结构定义未正确终止。