C语言 当我创建并向结构添加值时发生了一些事情,导致段错误



所以我对我的RPC程序进行了一些更新,现在它的段错误,我不确定我在这里做错了什么。两者之间的区别在于删除了为args结构赋值的 if 语句。

隔离错误

void
database_1(char *host, char *action, char *message)
{        
    printf("Action: %sn", action);
    printf("Message: %sn", 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: %sn", action);
    printf("Message: %sn", 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 */
}

您没有向我们展示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它们。

相关内容

  • 没有找到相关文章

最新更新