使用sizeof分配和初始化矩阵

时间:2016-01-10 20:22:11

标签: c arrays pointers dynamic

是否可以使用 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去写入首先分配的内存)。确切地说,问题是什么?

感谢。

1 个答案:

答案 0 :(得分:1)

这是因为*(v + i * sizeof(char *))相当于v[i * sizeof(char *)]*((unsigned char *) v + i * sizeof(char *) * sizeof(char *)

在指针运算中,增量以指针类型为单位执行,在本例中为char *

如果你想自己计算偏移量,只需将指针转换为unsigned char *,但是,

  1. 绝对是多余的,除非在某些情况下,您不希望指针具有明确的类型且它是void *,在这种情况下,转换为unsigned char *并且增加确切的字节数是可以的。

  2. 没有充分的理由认为这是一项要求,您不能使用sizeof运算符,因为它是一项要求,而是因为您需要。

  3. 它很容易出错,您可以很容易地导致未定义的行为,就像您的代码一样,这更令人不安

    *(*(v + i * sizeof(char*)) + j * sizeof(char))
    

    详细说明,

    1. sizeof(char)无法与1不同,它就像乘以 sin 2 (x)+ cos 2 (x),这绝对没有意义。
    2. 由于第一个点,您正在将指针移动到分配的空间之外。