是否可以使用 sizeof operator 而不是索引和“标准”指针算法动态分配(和释放)矩阵(或其他多维数组)?
我试过这个:
#include <stdio.h>
#include <stdlib.h>
#define ROWS 3
#define COLUMNS 4
int main(void)
{
int i, j;
char **v;
if((v = malloc(ROWS*sizeof(char*)))==NULL)
return -1;
for(i=0; i<ROWS; i++)
{
if((*(v + i * sizeof(char*)) = malloc(COLUMNS * sizeof(char)))==NULL)
return -2;
}
for(i=0; i<ROWS; i++)
{
for(j=0; j<COLUMNS; j++)
{
*(*(v + i * sizeof(char*)) + j * sizeof(char)) = 'a' + i * COLUMNS + j;
printf("%c",*(*(v + i * sizeof(char*)) + j * sizeof(char)));
}
}
for(i=0; i<ROWS; i++)
{
free(*(v + i * COLUMNS * sizeof(char)));
}
free(v);
return 0;
}
但它会生成核心转储(第24行的SIGSEGV(v [1] [0]))。我认为问题在于分配(可能用于分配v [1],v [2] ... v [ROWS] malloc去写入首先分配的内存)。确切地说,问题是什么?
感谢。
答案 0 :(得分:1)
这是因为*(v + i * sizeof(char *))
相当于v[i * sizeof(char *)]
或*((unsigned char *) v + i * sizeof(char *) * sizeof(char *)
。
在指针运算中,增量以指针类型为单位执行,在本例中为char *
。
如果你想自己计算偏移量,只需将指针转换为unsigned char *
,但是,
绝对是多余的,除非在某些情况下,您不希望指针具有明确的类型且它是void *
,在这种情况下,转换为unsigned char *
并且增加确切的字节数是可以的。
没有充分的理由认为这是一项要求,您不能使用sizeof
运算符,因为它是一项要求,而是因为您需要。
它很容易出错,您可以很容易地导致未定义的行为,就像您的代码一样,这更令人不安
*(*(v + i * sizeof(char*)) + j * sizeof(char))
详细说明,
sizeof(char)
无法与1
不同,它就像乘以 sin 2 (x)+ cos 2 (x),这绝对没有意义。