打印加载了void指针的char数组的值。

问题描述 投票:0回答:1

我有下面的代码,我把数组的地址传递给函数 "GetStr"。GetStr函数的原型是固定的。

在下面的代码中,我将命令行参数(字符串)传递给函数 "GetStr",并更新变量 "str "地址中的值。

问题打印1时,我从命令行参数中得到了我所传递的值。在主函数中的打印2时,我无法打印或取回值。请你告诉我如何在 "Print 2 "语句中打印数值。

int GetStr(void *RetVal, int argc, char **argv)
{
    if(argc != 0){

        if(argv != NULL && argv[1] != '\0'){
            RetVal = argv[1];
        }
        else{
            RetVal = '\0';
        }
        cout<< " RetVal: " << (char *)RetVal <<endl; ->>>  PRINT 1
    }
    else{
        return -1;
    }
    return 0;
}

驱动程序。

int main(int argc, char **argv)
{
    char str[8];

    GetStr(str,argc,argv);

    cout<<"HH: "<<((char *)(str))<<endl;  ->>>  PRINT 2 
  }
c++ pointers
1个回答
4
投票

你必须使用 strcpy() 来复制一个字符串。你只是把地址分配给了 argv[1] 到本地变量 RetVal,它对调用器中的数组没有影响。

你还应该检查 argc 以确定 argv[1] 已经提供。

int GetStr(void *RetVal, int argc, char **argv)
{
    if(argc != 0){

        if(argv != NULL && argc >= 2){
            strcpy((char*)RetVal, argv[1]); // copy first argument
        }
        else{
            *(char*)RetVal = '\0'; // Set to empty string
        }
        cout<< " RetVal: " << (char *)RetVal <<endl; ->>>  PRINT 1
    }
    else{
        return -1;
    }
    return 0;
}

需要注意的是,必须投下 RetVal 在赋值中通过它间接引用之前,因为你不能对一个 void 指针。


1
投票

参数 RetVal 是函数的局部变量 GetStr. 它的改变不会影响传递给函数的原始参数。此外,由于原始参数是一个数组,那么数组没有赋值操作符。你必须复制由 argv[1] 到传递的数组中。

所以在任何情况下,这条语句

RetVal = argv[1];

而这

RetVal = '\0';

相对于传递的数组没有任何影响。而且不清楚你在上面第二条语句中想做什么。要么你想将指针设置为NULL。或者你想将第一个指向的字节设置为终止的零字符,这是无效的,因为指针没有被取消引用,而且其类型是 void *.

此外,似乎在if语句中没有这个表达式

argv[1] != '\0'

你是说

argv[1][0] != '\0'

argv[1] != nullptr

在任何情况下,这两个if语句

if(argc != 0){

    if(argv != NULL && argv[1] != '\0'){

可以用一个if语句代替

if ( not ( argc < 2 ) )

该函数至少可以是以下方式

int GetStr( void *RetVal, int argc, char **argv )
{
    int error = argc < 2 ? -1 : 0;

    if ( not error )
    {
        strcpy( RetVal, argv[1] );
    }

    return error;
}

该函数除了用于调试目的外,不应该输出任何信息。该函数的调用者将决定是否输出任何信息。

要注意的是,这个函数是不安全的,因为传递的数组可能小于复制由 argv[1].

© www.soinside.com 2019 - 2024. All rights reserved.