C Matrix redimensioning导致段错误
C Matrix redimensioning leading to segfault
我有一个字符串数组 (char**),当它达到其容量时,我需要对其进行一些尺寸调整。因此,在这个函数中,我创建了一个新数组,分配了比以前大两倍的大小,并为旧数组中的每个字符串分配 space 给新数组并复制内容。代码如下:
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 行中的新字符串分配 space 时,我遇到了很多段错误。根据 Valgrind 的说法,那些 malloc
命令正在从为数组分配的 space 中分配 space,这是很小的 - 我最多使用 10 或 20 个字符串的数组 - 等等它溢出到其他分配的区域,导致段错误。如果我提高数组内存分配(例如 malloc (*size * 200)
一切运行顺利。
对正在发生的事情有什么想法吗?在其他任何地方都没有看到这种行为。
malloc
参数是以字节为单位的大小。所以你应该这样称呼它
malloc(sizeof(char *) * (*size) * 2);
通过调用
malloc(*size * 2);
您正在分配 2*size
字节的内存,这对于 size
个指针来说是不够的。
我有一个字符串数组 (char**),当它达到其容量时,我需要对其进行一些尺寸调整。因此,在这个函数中,我创建了一个新数组,分配了比以前大两倍的大小,并为旧数组中的每个字符串分配 space 给新数组并复制内容。代码如下:
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 行中的新字符串分配 space 时,我遇到了很多段错误。根据 Valgrind 的说法,那些 malloc
命令正在从为数组分配的 space 中分配 space,这是很小的 - 我最多使用 10 或 20 个字符串的数组 - 等等它溢出到其他分配的区域,导致段错误。如果我提高数组内存分配(例如 malloc (*size * 200)
一切运行顺利。
对正在发生的事情有什么想法吗?在其他任何地方都没有看到这种行为。
malloc
参数是以字节为单位的大小。所以你应该这样称呼它
malloc(sizeof(char *) * (*size) * 2);
通过调用
malloc(*size * 2);
您正在分配 2*size
字节的内存,这对于 size
个指针来说是不够的。