【问题标题】:Unable to allocate memory inside a function and return it in C [closed]无法在函数内部分配内存并在 C 中返回它 [关闭]
【发布时间】:2017-06-16 18:13:25
【问题描述】:

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

#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] 除外。

这段代码有什么问题?

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。您的回答解释了我遇到的所有错误的原因。来自莫斯科的弗拉德给出了避免这些错误的不同方法。所以我接受了这个答案。
【解决方案2】:

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

对于像这样的表达式

 *q[2]

它被解释为

*(q[2])

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

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

你需要写

 (*q)[2] = 10;

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

【讨论】:

    【解决方案3】:

    而不是这个错误的分配

    *q[2] = 10;
    

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

    *( q[2] ) = 10;
    

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

    ( *q )[2] = 10;
    

    甚至只是喜欢

    q[0][2] = 10;
    

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

    char *p = *q;
    
    p[2] = 10;
    

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

    【讨论】:

    • 并且在分配内存之前不要误加中间变量p。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2012-06-02
    • 2012-10-23
    相关资源
    最近更新 更多