2016-04-26 27 views
0

因此,我對RPC程序進行了一些更新,現在對其進行了segfaulting,我不確定我在這裏做了什麼錯誤。兩者之間的區別在於刪除了將值賦給args結構的if語句。當我創建並向我的結構添加值時發生了某些事情,導致出現段錯誤

段錯誤

void 
database_1(char *host, char *action, char *message) 
{   
    printf("Action: %s\n", action); 
    printf("Message: %s\n", message); 
    CLIENT *clnt; 
    rpc_args *result_1; 
    //struct rpc_args action_1_arg; 

    //rpc arguments struct to pass to server 
    struct rpc_args *args = malloc(sizeof(struct rpc_args)); 

    char *id = generate_id(); 
    if (strcmp(action, "GET") == 0) { 
     strcpy(args->action, action); 
     strcpy(args->id, id); 
    } else if(strcmp(action, "PUT") == 0) { 
     strcpy(args->action, action); 
     strcpy(args->id, id); 
     strcpy(args->message.content, message); 
    } 

#ifndef DEBUG 
    clnt = clnt_create (host, DATABASE, ASSIGNMENT_7, "udp"); 
    if (clnt == NULL) { 
     clnt_pcreateerror (host); 
     exit (1); 
    } 
#endif /* DEBUG */ 

    result_1 = action_1(args, clnt); 
    if (result_1 == (rpc_args *) NULL) { 
     clnt_perror (clnt, "call failed"); 
    } 
#ifndef DEBUG 
    free(args); 
    clnt_destroy (clnt); 
#endif /* DEBUG */ 
} 

不段錯誤

void 
database_1(char *host, char *action, char *message) 
{   
    printf("Action: %s\n", action); 
    printf("Message: %s\n", message); 
    CLIENT *clnt; 
    rpc_args *result_1; 
    //struct rpc_args action_1_arg; 

    //rpc arguments struct to pass to server 
    struct rpc_args *args = malloc(sizeof(struct rpc_args)); 

    char *id = generate_id(); 

#ifndef DEBUG 
    clnt = clnt_create (host, DATABASE, ASSIGNMENT_7, "udp"); 
    if (clnt == NULL) { 
     clnt_pcreateerror (host); 
     exit (1); 
    } 
#endif /* DEBUG */ 

    result_1 = action_1(args, clnt); 
    if (result_1 == (rpc_args *) NULL) { 
     clnt_perror (clnt, "call failed"); 
    } 
#ifndef DEBUG 
    free(args); 
    clnt_destroy (clnt); 
#endif /* DEBUG */ 
} 
+1

你可以顯示'struct rpc_args' ?.會員'行動'和'ID'可能是字符指針?如果是這樣,你也必須爲它們中的每一個分配內存。 – Unimportant

+0

@ user1320881是的,這正是它。 – chrisd1100

回答

1

你沒向我們展示struct的定義,但要確保它看起來是這樣的:

#define MAX_STRING_SIZE 128 

struct rpc_args { 
    /* other members here */ 
    char action[MAX_STRING_SIZE]; 
    char id[MAX_STRING_SIZE]; 
}; 

同樣,在args->message.content處使用的struct必須所以要這樣定義。

如果您使用類似上面的實現,請確保您檢查您正在複製的字符串的長度小於MAX_STRING_SIZE - 1

另外,使用strcpy到這些成員之前,你可以動態的字符串與malloc當你收拾結構分配空間,然後free他們。

相關問題