无法在函数内部分配内存并在C中返回

时间:2017-01-31 10:35:41

标签: c memory segmentation-fault malloc pointer-to-pointer

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

#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]写一些东西时,它会给出&#34;分段错误(核心转储)&#34;。

此外,我使用p[ ]p[0]以外的所有数据为0。

此代码有什么问题?

3 个答案:

答案 0 :(得分:2)

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

表达式

 *q[2]

它被解释为

*(q[2])

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

  • x的类型为char *
  • x的类型为char **

你需要写

 (*q)[2] = 10;

显式地,首先取消引用q以获取char *,然后使用索引来获取char。

答案 1 :(得分:2)

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

因此*q[2]是地址q + 2的值。你想要的是*q + 2的价值。因此,请使用(*q) + 2

*q[0]*q[1]未提供细分错误,因为地址q + 0q + 1已分配给您的流程。

地址q + 2未分配给您的流程,因此也是分段错误。

答案 2 :(得分:0)

而不是错误的作业

*q[2] = 10;

这是由于运算符优先级相当于

*( q[2] ) = 10;

因此,解除引用的指针q [2]未初始化并具有不确定的值。你应该写像

( *q )[2] = 10;

甚至只是喜欢

q[0][2] = 10;

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

char *p = *q;

p[2] = 10;

这允许使用指针来逃避这种错误。