我想使用函数为指针分配一些内存。以下是我写的代码:
#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。
此代码有什么问题?
答案 0 :(得分:2)
由于缺少显式括号,因此默认operator precedence生效,您的表达式被错误地解释。
表达式
*q[2]
它被解释为
*(q[2])
这是你不想要的。指针算术遵循数据类型,因此,x + 1
或x[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 + 0
,q + 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;
这允许使用指针来逃避这种错误。