指向堆栈分配的char数组的指针

时间:2014-04-06 17:16:44

标签: c arrays pointers

我有一个分配了堆栈的数组,用于保存错误消息。在大多数情况下,我调用一个返回错误代码的函数,并根据该代码我知道要添加到数组中的内容,所以我使用一个简单的数组:

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;

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

2 个答案:

答案 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

一样使用pointToBuf
pointToBuf[0] = 'c';