【问题标题】:How to iterate through a char ** variable如何遍历 char ** 变量
【发布时间】:2019-04-30 03:07:01
【问题描述】:

我正在运行一个小型 rpc 程序/使用 rpc 框架,该框架从客户端文件中获取 char[] 并将其发送到枚举字符串中的整数的服务器。

我有一个文件client.c,它接受用户输入并将其传递给头文件中的外部函数。

#include <rpc/rpc.h>
#include "getNumInt.h"

int main(int argc, char **argv){
    CLIENT *cli;
    char *server;
    server = argv[1];

    cli = clnt_create(server, GETNUMINT, GNUMINT, "tcp"); //creates a client handle
    /*does some check for whether the client connected*/
    char command[256];
    int *numInt;
    fgets(command, 256, stdin); 
    numInt = enumints_1(&command, cli); //segfaults here according to backtrace
    return(0);
}

函数enumints_1在我的服务器存根server.c中定义为:

int *enumints_1(msg, req)
    char **msg; struct svc_req *req;{
    printf(*msg);
    static int numDigits = 0;
    char msgcopy[256];
    strcpy(msgcopy, *msg);
    int i = 0;
    for(i; i<strlen(msgcopy); i++){
        if(msgcopy[i] >= '0' && msgcopy[i] <='9'){
            numDigits++;
        }
    }
    return(&numDigits);
}

我的主要问题是我如何遍历char **msg,因为这可能是我的程序出现段错误的原因。 command 只是从用户输入中获取的字符串,然后通过引用传递给 enumints_1 函数。 因为它是一个指向点的指针,所以我认为我可以只使用strcpymemcpy 将字符串复制到 char 数组中,但这不起作用。

还有我的.x 文件:

struct intStringPair{
    int numInts;
    char msg[256];
};

program GETNUMINT{
    version GNUMINT{
        int ENUMINTS(string) = 1; //string considered char * the rpc generated file makes it so enumints_1 then has to take char **
        int WRITEMESSAGE(intStringPair) = 2;
    } = 1;
}= 0x20000001;

【问题讨论】:

  • command 不是指针。所以&amp;command 不是指向指针的指针。
  • 哎呀。为什么enumints_1 使用古老的无类型函数接口?普通原型更不容易出错。
  • @Gene 它们是由 rpcgen 从 .x 文件自动生成的。编辑:我误解了,不幸的是,原型是 rpcgen 生成.h 所需要的,这就是enumints_1 的来源

标签: c pointers segmentation-fault rpc


【解决方案1】:

就像@user3386109 说的:

command 不是指针。所以 &command 不是指向指针的指针

所以将 &command 分配给 msg 是无效的(我的编译器甚至没有编译它)

当我编译这段代码时:

// my set up code

#include <stdio.h>
#include <string.h>
struct svc_req {};
typedef struct svc_req CLIENT;
struct svc_req *clnt_create(const char *, int, int, const char*) {return 0;}
int GETNUMINT=0, GNUMINT=0;

// your code verbatim

int *enumints_1(char **msg, struct svc_req *req){
    printf(*msg);
    static int numDigits = 0;
    char msgcopy[256];
    strcpy(msgcopy, *msg);
    int i = 0;
    for(i; i<strlen(msgcopy); i++){
        if(msgcopy[i] >= '0' && msgcopy[i] <='9'){
            numDigits++;
        }
    }
    return(&numDigits);
}

int main(int argc, char **argv){
    CLIENT *cli;
    char *server;
    server = argv[1];

    cli = clnt_create(server, GETNUMINT, GNUMINT, "tcp"); //creates a client handle
    /*does some check for whether the client connected*/
    char command[256];
    int *numInt;
    fgets(command, 256, stdin); 
    numInt = enumints_1(&command, cli); //segfaults here according to backtrace
    return(0);
}

编译器说:

<source>: In function 'int main(int, char**)':
<source>:34:25: error: cannot convert 'char (*)[256]' to 'char**'
     numInt = enumints_1(&command, cli); //segfaults here according to backtrace
                         ^~~~~~~~
<source>:10:24: note:   initializing argument 1 of 'int* enumints_1(char**, svc_req*)'
 int *enumints_1(char **msg, struct svc_req *req){
                 ~~~~~~~^~~
Compiler returned: 1

你可以做的是创建一个指向数组的指针,然后传递它的地址:

// my set up code
#include <stdio.h>
#include <string.h>
struct svc_req {};
typedef struct svc_req CLIENT;
struct svc_req *clnt_create(const char *, int, int, const char*) {return 0;}
int GETNUMINT=0, GNUMINT=0;

// your code verbatim
int *enumints_1(char **msg, struct svc_req *req){
    printf(*msg);
    static int numDigits = 0;
    char msgcopy[256];
    strcpy(msgcopy, *msg);
    int i = 0;
    for(i; i<strlen(msgcopy); i++){
        if(msgcopy[i] >= '0' && msgcopy[i] <='9'){
            numDigits++;
        }
    }
    return(&numDigits);
}

int main(int argc, char **argv){
    CLIENT *cli;
    char *server;
    server = argv[1];

    cli = clnt_create(server, GETNUMINT, GNUMINT, "tcp"); //creates a client handle
    /*does some check for whether the client connected*/
    char command[256], *command_pointer=command;
    int *numInt;
    fgets(command, 256, stdin); 
    numInt = enumints_1(&command_pointer, cli); //segfaults here according to backtrace
    return(0);
}

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多