【问题标题】:C Matrix redimensioning leading to segfaultC 矩阵重新尺寸调整导致段错误
【发布时间】:2015-08-30 02:38:20
【问题描述】:

我有一个字符串数组 (char**),当它达到其容量时,我需要对其进行一些重新调整。因此,在这个函数中,我创建了一个新数组,分配了比以前大两倍的大小,并且为旧数组中的每个字符串分配了新数组的空间并复制了内容。代码如下:

void matrix_double (char ***arrayptr, int *size) {
    char **array = *arrayptr, **newarr;
    int i, wordsize;
    newarr = malloc (*size * 2);
    for (i = 0; i < *size; i++) {
        wordsize = strlen (array[i]);
        newarr[i] = malloc (wordsize + 1);
        strcpy (newarr[i], array[i]);
        free (array[i]);
    }
    *size *= 2;
    free (array);
    *arrayptr = newarr;
}

但是,在为第 7 行中的新字符串分配空间时,我遇到了很多段错误。根据 Valgrind 的说法,那些malloc 命令正在从为数组分配的空间中分配空间,这个空间很小——我最多使用 10 或 20 个字符串的数组——因此它会溢出到其他分配的区域,导致段错误。如果我提高数组内存分配(例如malloc (*size * 200) 一切运行顺利。

对正在发生的事情有任何想法吗?在其他任何地方都没有看到这种行为。

【问题讨论】:

  • malloc (*size * 2); - 你似乎忘记了你应该在某些地方分配 指针 数组;不仅仅是字符。
  • 调整数组大小时,不必创建字符串的副本;您可以简单地将旧数组中的指针分配给新数组中的相应指针。如果您的数组是任何大小的,那将节省大量复制。您应该考虑strdup() 的优点(和可移植性缺点)。您还需要决定如何处理内存分配失败。

标签: c arrays pointers matrix segmentation-fault


【解决方案1】:

malloc 参数是以字节为单位的大小。所以你应该这样称呼它

malloc(sizeof(char *) * (*size) * 2);

通过调用

malloc(*size * 2);

您正在分配 2*size 字节的内存,这对于 size 的指针来说是不够的。

【讨论】:

  • 你是对的。我在想一个指针只占用一个字节,但它却占用了 8 个字节。谢谢!
  • @GustavoSilva 指针在 32 位系统上采用 32 位,在 64 位系统上采用 64 位。所以不要硬编码它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2014-03-30
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多