2015-11-04 98 views
-5
#include <stdio.h> 

struct data 
{ 
    char a[100*1024]; 
}; 

struct test 
{ 
    void * pc; 
    struct test * next; 
}; 

struct data dd; 
struct data * pd = &dd; 

void *mall(struct data *p) 
{ 
    return (void *)(&(p->a[0])); 
} 

int main(void) 
{ 
    struct test * p = mall(pd); 
    p->pc = "testasdfsadfasdfasdfasdfsadfsadfsadfsadfsadfsadfsadfsadfasdfsadfsadfsadfsadfsadfasdfsadfsadfsadfsadf"; 
    printf("%p\n%p\n", &dd.a[0], p->pc); // <-- line 27 
    return 0; 
} 

我不明白如何分配給主內存中的內存,我認爲沒有內存分配給P - > PC,但程序可以正常運行。如果你認爲內存是全局數組,那麼第27行的輸出如何不一樣呢?C內存分配

+0

嘗試打印地址。 –

+0

調用未定義的行爲。 – Olaf

+0

我已經完成了。 p的地址與a相同,但不是pc。而dd.a [0]沒有賦值。所以我不知道p-> pc存儲的內容在哪裏。 – ponypaver

回答

1

27號線的輸出怎麼不一樣?

在 「第27行」

  • &dd.a[0]評估爲dd.a的第一個元件的地址。

  • p->pc持有字符串文字"testasdfsadfasdfasdfas..."的地址作爲此行

    p->pc = "testasdfsadfasdfasdfas..."; 
    

(你知道一個也不會在C數組分配,不是嗎?)

分配
+0

先生,如果你打印'&p-> pc',那麼你會得到相同的地址。 – ameyCU

0

你正在做所有的事情。所以你不需要malloc任何東西到堆中。你不會段錯誤,因爲你的程序仍然可以訪問你分配給你的字符串的內存(考慮到你不能分配字符串的事實)。