【问题标题】:Allocate and initialize matrix using sizeof使用 sizeof 分配和初始化矩阵
【发布时间】:2016-01-10 20:22:11
【问题描述】:

是否可以使用 sizeof 运算符而不是索引和“标准”指针算法来动态分配和初始化(和释放)矩阵(或其他多维数组)?

我试过了:

#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 会写入第一次分配的内存)。究竟是什么问题?

谢谢。

【问题讨论】:

    标签: c arrays pointers dynamic


    【解决方案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 不同,就像乘以 sin2(x) + cos2(x ),这完全没有意义。
      2. 由于又是第一个点,您将指针递增到超出分配空间的方式。

    【讨论】:

    • 第一个问题(是否可以分配...)?
    • @SimoneBonato 为什么要这样做,为什么要坚持以错误的方式做?
    • 是不是走错路了?我认为这是一种不可取的方式,但并非完全错误。
    • 我使用 sizeof(char) 因为它很容易变成 sizeof(other)。
    • 这就像试图解决一个物理问题,并选择可能的最差参考系。我们都知道解决方案存在于任何惯性参考系中,但我们选择解决方案简单的那个,而不是不可能的。
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    相关资源
    最近更新 更多