我有一个分配了堆栈的数组,用于保存错误消息。在大多数情况下,我调用一个返回错误代码的函数,并根据该代码我知道要添加到数组中的内容,所以我使用一个简单的数组:
char buf[1024];
现在我有一个可以返回错误代码的函数,或者可以提供一些"结果。"在这种情况下,保存结果的数组在其他地方分配,没有理由从一个数组复制到另一个数组,所以我真的想使用指向数组的指针并传递它。这样,如果函数返回没有错误,则就可以使用buf了。所以像这样:
char _buf[1024];
char **buf = &_buf;
显然这不会起作用,因为类型是错误的。转换为char **编译(FWIW,我使用gcc -std=c99 -W -Wall -g -gdb
)但是当我尝试使用*buf
时会出现段错误。
char _buf[1024];
char **buf = (char**)&_buf;
我当前的解决方案是使用一个中间变量,但这似乎只是在我们想要的方式做到了:
char _buf[1024];
char *tmp = _buf;
char **buf = &tmp;
所以,我的问题是:有没有更合适的方法来完成这三条线?
答案 0 :(得分:1)
假设这意味着我的想法:
现在我有一个可以返回错误代码或可以提供的函数 一些"结果。"
您的函数接受char*
的地址,该地址将成功填充一些动态结果,但主机 as-input 将在事件中填充错误消息缓冲区的地址失败,并且调用者负责根据函数的结果辨别要采取的相应操作(成功意味着稍后释放结果,失败意味着调用者提供的输入缓冲区现在具有错误消息。
如果这是准确的,那么这可能是您想要的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// some function that fails when param is less than zero
int some_action(int param, char **res)
{
if (param < 0)
{
if (*res)
sprintf(*res, "param = %d", param);
return -1;
}
*res = strdup("success data here");
return 0;
}
int main()
{
int i=0;
for (i=-2; i<2; ++i)
{
char errmsg[1024] = "";
char *res = errmsg;
if (some_action(i, &res) == 0)
{
printf("Success: %s\n", res);
free(res);
}
else
{ // error (no free needed)
printf("Error: %s\n", res);
}
}
return 0;
}
<强>输出强>
Error: param = -2
Error: param = -1
Success: success data here
Success: success data here
注意:我并不特别建议这种方法,因为从长远来看,你并没有真正保存任何,除非你预料到大量的错误,应该是一个例外,而不是一个规范。此外,如果您仍然考虑这样做,我会强烈建议您向操作函数提供错误缓冲区长度数据,并利用它来确保安全,防止可能的缓冲区溢出。 (我会这样做的,但你必须在这里做某事。)
答案 1 :(得分:0)
最终_buf只存储指向数组中第一个元素的指针
因此,如果您希望能够存储指向数组的指针,那么您只需要一个char *
示例:
char _buf[1024];
char* pointToBuf = _buf;
这也与
相同char _buf[1024];
char* pointToBuf = &_buf[0];
您现在可以像使用_buf
一样使用pointToBufpointToBuf[0] = 'c';