2012-04-04 43 views
0

我想知道我在這裏做錯了什麼?我將void指針轉換爲結構緩衝區,並且只打印出垃圾。現在不應該緩衝指向指向我們爲內存分配的原始緩衝區的指針嗎?主題和指針C

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

struct buffer{ 
     int a; 
     char *string[]; 
}buffer; 

void thread1_function(void *ptr){ 
     struct buffer *buffer=(struct buffer*)ptr; 

     printf("hello world\n"); 

     printf("%s-%n\n", buffer->string,buffer->a); 

} 

int main(){ 

     struct buffer *buffer; 
     int err; 
     buffer = (struct buffer*)malloc((11*sizeof(char))+sizeof(int)); 
     pthread_t thread1; 
     sprintf(buffer->string,"%s","strint"); 
     buffer->a=1; 
     printf("main: %s - %d\n",buffer->string,buffer->a); 
     err = pthread_create(&thread1, NULL, thread1_function, &buffer); 
     printf("error: %d\n",err); 
     pthread_join(thread1,NULL); 
     return 0; 
} 

回答

4

您傳遞指針的指針結構,以你的線程。嘗試將指針傳遞給結構。 )

err = pthread_create(&thread1, NULL, thread1_function, &buffer); 

變得

err = pthread_create(&thread1, NULL, thread1_function, buffer); 

編輯: 又發現一個錯誤:在線程功能printf("...%n")%n表示將迄今爲止寫入的數字存儲在該位置,該位置處的int*參數指向。你顯然意思是%d那裏,就像你的main()一樣。

+0

+ 1用於發現它,這很可能是原因,但分配仍需要修復。 – 2012-04-04 07:28:58

+0

[線程調試使用libthread_db所啓用] 主:strint - 1 [新主題0xb7fe3b70(LWP 24311)] 錯誤:0 世界你好 計劃接收信號SIGSEGV,分割過錯。 [切換主題0xb7fe3b70(LWP 24311)] 0x0018f5c9在_IO_vfprintf_internal(S = 0x1,則格式= <優化掉>,AP = 0xb7fe337c 「$ \ 200 \ 001」)在vfprintf.c:1622 vfprintf.c : 無此文件或目錄。 \t in vfprintf.c (gdb) – 2012-04-04 07:36:42

+0

發現另一個錯誤,並編輯我的答案。 – user1252434 2012-04-04 07:47:06

4

struct的string構件被定義爲char *指針 「柔性」 陣列。您似乎將其視爲一組字符,而不是將其分配爲11 * sizeof(char)字節,然後將字符串複製到它。

我覺得你結構的預期佈局應該如下:

struct buffer { 
    int a; 
    char string[]; 
} buffer; 

然後將它分配爲:

buffer = malloc(sizeof(struct buffer) + SIZE_OF_STRING); 
+0

當我這樣做的它在malloc的只是賽格故障 – 2012-04-04 07:21:16

+0

@CraigSparks:我不相信它可能malloc中的segfault,如果你沒有給這個字符串分配足夠的空間,最有可能發生在那之後? – 2012-04-04 07:23:48

+0

這可能是填充,使用'sizeof struct buffer'或類似來分配足夠的內存。 – moooeeeep 2012-04-04 07:29:26

2

除了票據別人已經提供:

  • 您應該使用snprintf以絕對避免改寫string的界限。
  • 您應該使用sizeof(struct buffer)(或簡單地在堆棧上創建一個struct buffer)以確保分配了足夠的內存(可能存在填充問題)。您可能還需要分配內存並正確初始化字符數組和指針(string)。
  • 查看pthread_create的手冊頁,第三個參數應該是&thread1_function,即函數指針。另外,thread1_function()需要返回void*,而不是void
  • 您是否注意到,名稱buffer(全局範圍內的一個變量和內部函數main())中有兩個變量?你怎麼確定你傳遞給線程的是哪一個?

畢竟,這個代碼有很多問題,我並不感到驚訝的是,在你修正了一個錯誤之後它仍然失敗。 (其實我很驚訝,它並編譯。)


下面是一些固定的編碼:有在第一編譯代碼了很多警告。你不應該忽視警告。即使您的代碼編譯完成,警告通常也是有價值的信息來追蹤錯誤,尤其是在程序失敗時顯着。就像你的情況一樣。首先,你不應該關心打印的垃圾,而應該關注編譯器向你發出的警告!

(如果您想了解更多的警告試圖通過-Wall -Wextra -pedantic到您選擇的gcc。)

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

struct buffer{ 
    int a; 
    char string[10]; 
}; 

void* thread1_function(void *ptr){ 
    struct buffer *buffer=(struct buffer*)ptr; 
    printf("hello world\n"); 
    printf("%s-%d\n", buffer->string,buffer->a); 
    return NULL; 
} 

int main(){ 

    int err; 
    pthread_t thread1; 
    struct buffer *buffer; 

    buffer = (struct buffer*)malloc(sizeof (struct buffer)); 
    buffer->a=1; 
    snprintf(buffer->string, sizeof buffer->string, "%s", "strint"); 
    printf("main: %s - %d\n", buffer->string, buffer->a); 

    err = pthread_create(&thread1, NULL, &thread1_function, buffer); 
    printf("error: %d\n", err); 
    pthread_join(thread1, NULL); 

    return 0; 
} 
+1

我對那個字符串[]也不滿意。這不僅僅是需要單獨分配來指向足夠空間來容納字符串字符的結構中的指針嗎?如果是我,我會用'char string [128]'替換[],直到所有其他問題都排序並且線程運行正常。 – 2012-04-04 07:55:16

+0

另一種選擇是將它實際用作字符串指針並使用'asprintf'初始化它。 – user1252434 2012-04-04 07:56:31

+0

另一個有趣的事情 - 我已經注意到,在類似的代碼中,將函數作爲'threadFunc'或'&threadFunc'傳遞似乎並不重要。它工作,(或崩潰:)以相同的方式。 – 2012-04-04 08:07:29