无法在函数内分配内存并在 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 + 1
或 x[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 + 0
、q + 1
已分配给您的进程。
地址 q + 2
未分配给您的进程,因此出现分段错误。
我想使用函数为指针分配一些内存。以下是我写的代码:
#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 + 1
或 x[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 + 0
、q + 1
已分配给您的进程。
地址 q + 2
未分配给您的进程,因此出现分段错误。