无法在函数内分配内存并在 C 中 return

Unable to allocate memory inside a function and return it in C

我想使用函数为指针分配一些内存。以下是我写的代码:

#include <stdio.h>
#include <stdlib.h>

int test( unsigned char **q)
{
    *q = (unsigned char *) malloc(250);
    if(*q == NULL)
    {
        printf("\n Error: failed to allocate memory");
        return -1;
    }   
//  *q[0] = 10;
//  *q[1] = 10;
    *q[2] = 10;

    return 0;   /* Returns 0 on success, non-zero value on failure */
}

int main(void)
{
    unsigned char *p;

//  printf("\n &p = %u", &p);
    int result = test(&p);  

//  printf("\n p[2] = %d", p[2]);
    return 0;
}

如果我在*q[0]*q[1]中写东西,就没有错误。但是当我尝试向 *q[2] 写入内容时,它会给出 "Segmentation fault (core dumped)".

此外,我使用 p[ ] 将所有数据都设为 0,p[0] 除外。

这段代码有什么问题?

由于缺少显式括号,因此默认 operator precedence 生效,您的表达式被错误解释。

对于像

这样的表达式
 *q[2]

解释为

*(q[2])

这是你不想要的。指针算法遵循数据类型,因此,x + 1x[1] 将有 不同的 结果,当

  • x 是类型 char *
  • x 的类型是 char **.

你需要写

 (*q)[2] = 10;

明确地,首先取消引用 q 以获取 char *,然后,使用索引获取字符。

而不是这个错误的赋值

*q[2] = 10;

这是由于运算符优先级等同于

*( q[2] ) = 10;

因此取消引用的指针 q[2] 未初始化且具有不确定的值。你应该写成

( *q )[2] = 10;

甚至只是喜欢

q[0][2] = 10;

另一种方法是引入一个中间变量并用它来初始化数组的元素。例如

char *p = *q;

p[2] = 10;

这允许使用指针来避免此类错误。

由于 C 语言的运算符优先级,对于 *q[2][] 运算符在 * 运算符之前计算。

因此 *q[2] 是地址 q + 2 处的值。你想要的是 *q + 2 的价值。所以使用 (*q) + 2.

*q[0]*q[1] 没有给出分段错误,因为地址 q + 0q + 1 已分配给您的进程。

地址 q + 2 未分配给您的进程,因此出现分段错误。