加载有空指针的字符数组的打印值

print value of char array which is loaded with void pointer

本文关键字:打印 数组 字符 空指针 加载      更新时间:2023-10-16

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

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

公关: 在打印 1 中,我正在获取从命令行参数传递的值。在主函数中打印 2,我无法打印或取回值。您能否告诉我如何在"打印2"语句中打印值

int GetStr(void *RetVal, int argc, char **argv)
{
if(argc != 0){
if(argv != NULL && argv[1] != ''){
RetVal = argv[1];
}
else{
RetVal = '';
}
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 
}

您必须使用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 = ''; // Set to empty string
}
cout<< " RetVal: " << (char *)RetVal <<endl; ->>>  PRINT 1
}
else{
return -1;
}
return 0;
}

请注意,在分配中通过RetVal进行定向之前,必须强制转换它,因为您无法取消引用void指针。

参数RetVal是函数GetStr的局部变量。它的更改不会影响传递给函数的原始参数。此外,由于原始参数是一个数组,因此数组没有赋值运算符。您必须将argv[1]指向的字符复制到传递的数组中。

所以无论如何这个声明

RetVal = argv[1];

而这个

RetVal = '';

相对于传递的数组没有影响。目前还不清楚你在上面的第二个陈述中想做什么。或者要将指针设置为 NULL。或者,您希望将第一个指向的字节设置为无效的终止零字符,因为指针未取消引用,而且类型为void *

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

argv[1] != ''

你的意思是要么

argv[1][0] != ''

argv[1] != nullptr

无论如何,这两个if语句

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

可以替换为一个 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]指向的字符串所需的值。