2014-09-12 79 views
-1

以下是重現問題的一個最小示例。對我來說,代碼看起來很無辜。我懷疑struct timespc背後有一些魔法;然而,我找不到任何可以解釋它崩潰的原因。結構中的struct timespec

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <time.h> 

typedef struct _task 
{ 
    int id; 
    int deadline; 
    struct timespec processed_at; 
    int process_time; 
} task; 

int main(int argc, char *argv[]) 
{ 
    task *t = malloc(sizeof t); 
    t->process_time = 3; 
    free(t); 
    return 0; 
} 
+4

因爲你只是爲指針分配足夠的空間。 – 2014-09-12 20:49:44

+1

不要在你的問題中編輯答案,這讓人們第一次讀這個問題讓人困惑。相反,請接受其中一個已發佈的答案。如果沒有發佈好答案,但您已經解決了問題,則可以編寫自己的答案並接受答案。 – 2014-09-13 12:56:46

+0

@MattMcNabb感謝您的提示。完成。 – 2014-09-14 18:31:02

回答

2

所有現存的答案和評論指出了錯誤的關鍵部分。但是,sizeof的一些用法不正確,所以我正在回答這個問題。

我不小心看着這個SO,並假定OP提供了正確的語法。既然他/她正在談論爲什麼要使用風格,我預計兩者都是正確的。

至於它是用於()還是不用(),根據cppreference,()是需要的類型,但不是一元表達式。因此,sizeof task不正確(我在clang和gcc上遇到錯誤);相反,它應該是sizeof(task)sizeof *t

task *t = malloc(sizeof *t); // right 
task *t = malloc(sizeof(task)); // right 
task *t = malloc(sizeof task); // wrong both on gcc and clang 
task *t = malloc(sizeof t); // syntactically right, but it's not what you want 
+0

在我看來,第一種形式也是最好的選擇,因爲它避免了重複,因此可以在線條開頭指定的類型名稱更改,這在更復雜的場景(如數組分配/重新分配)中更加顯着。作爲副作用,它避免了括號的需要。 – 2014-09-14 18:36:25

+0

@OliverCharlesworth感到驚訝,你沒有抱怨2號是錯的,3號是正確的...... – UpAndAdam 2014-10-01 14:41:48

相關問題