C 指向堆栈分配的字符数组的指针

C 指向堆栈分配的字符数组的指针,c,arrays,pointers,C,Arrays,Pointers,我有一个堆栈分配的数组,用于保存错误消息。在大多数情况下,我调用一个返回错误代码的函数,根据该代码我知道向数组中添加什么,因此我使用一个简单的数组: char buf[1024]; 现在我有了一个函数,它可以返回错误代码或提供一些“结果”。在这种情况下,保存结果的数组被分配到其他地方,没有理由从一个数组复制到另一个数组,所以我真的想使用指向数组的指针并传递它。这样,如果函数返回时没有错误,那么buf就可以使用了。比如说: char _buf[1024]; char **buf = &_

我有一个堆栈分配的数组,用于保存错误消息。在大多数情况下,我调用一个返回错误代码的函数,根据该代码我知道向数组中添加什么,因此我使用一个简单的数组:

char buf[1024];
现在我有了一个函数,它可以返回错误代码或提供一些“结果”。在这种情况下,保存结果的数组被分配到其他地方,没有理由从一个数组复制到另一个数组,所以我真的想使用指向数组的指针并传递它。这样,如果函数返回时没有错误,那么buf就可以使用了。比如说:

char _buf[1024];
char **buf = &_buf;
显然,这是行不通的,因为类型是错误的。转换为字符**编译(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;

所以,我的问题是:有没有更合适的方法来完成这三行?

最终,buf只存储指向数组中第一个元素的指针

因此,如果你想存储一个指向数组的指针,你只需要一个字符*

例如:

char _buf[1024];
char* pointToBuf = _buf;
这也和

char _buf[1024];
char* pointToBuf = &_buf[0];
您现在可以用与_buf相同的方式使用pointToBuf

pointToBuf[0] = 'c';

假设这意味着我认为它的作用:

现在我有了一个函数,可以返回错误代码,也可以提供 一些“结果”

您的函数接受一个
char*
的地址,该地址在成功时将填充一些动态结果,但作为输入宿主一个错误消息缓冲区的地址,以便在发生故障时填充,调用方负责根据函数的结果识别要采取的适当操作(成功意味着稍后释放结果,失败意味着调用方提供的输入缓冲区现在有错误消息

如果这是准确的,那么这可能就是您想要的:

#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;
}

注意:我不特别建议这种方法,因为你不会真正地保存任何东西,除非你预期有大量错误,这应该是一个例外而不是一个规范。此外,如果你仍然考虑这样做,我强烈建议你将错误缓冲长度数据提供给你的动作函数和UTILI。调整它的大小以确保安全,防止可能的缓冲区溢出。(我本来会这样做的,但你必须在这里做一些事情)。

你使用
char**
作为指向char数组的指针,这是错误的。改为使用
char*
。你可能想显示一些包含提供“结果”的函数的示例代码。如果不了解您在实际操作中试图执行的操作,则很难提出解决方案。我理解,您正试图将输出参数(指向
char*
的指针)加倍,以便在“成功”时接收动态分配这是稍后负责释放的调用者,同时利用所述相同的输出参数托管调用者提供的错误消息缓冲区地址,以在“失败”事件中填充。这准确吗?请避免在您不知道自己在做什么的情况下进行强制转换,并且可以解释为什么强制转换对于正确的工作是必要的。永远不要关闭编译器,而是让它大声说话:使用
-Wall-Wextra
,并适当地处理所有警告。这与我试图做的最接近,但我没有解释n我的设计很好,足以让大家完全回答。所讨论的缓冲区是通过套接字发送到客户端的有效负载。我更改了它,以便始终发送代码,缓冲区只需要在结果类型调用成功的情况下发送。错误消息可以呈现在客户端。我试图避免的是当请求的结果是整个数组,而不是数组的某个子集。在这种情况下,我希望传递要发送的数组指针,而不是“结果”指针。
Error: param = -2
Error: param = -1
Success: success data here
Success: success data here