C语言中如何多次正确动态分配二维字符串内存?
解决你的C语言动态二维字符串分配问题
嘿,我来帮你搞定这个问题!首先你的代码里有几个明显的逻辑错误,这才导致了输入崩溃和段错误,和GCC编译器没关系哈。咱们一步步来:
先看代码里的核心bug
1. 分配qry_str时的指针覆盖
你在给qry_str的每个字符串分配内存时,写错了变量:
for(l = 0; l < Q; l++){ qry_str = malloc(MAX_STRING_SIZE * sizeof(char)); // 这里错了! scanf("%s",qry_str[l]); }
这里你直接把qry_str(原本是指向指针数组的指针)重新赋值成了单个字符串的地址,不仅丢失了之前分配的指针数组内存,还导致访问qry_str[l]时彻底越界,这就是输入时程序崩溃的原因。正确的应该是给qry_str[l]分配内存:
for(l = 0; l < Q; l++){ qry_str[l] = malloc(MAX_STRING_SIZE * sizeof(char)); scanf("%s",qry_str[l]); }
2. 释放qry_str时的循环条件错误
你释放qry_str的循环用了N作为上限,但qry_str的长度是Q:
for(x = 0; x < N; x++) free(qry_str[x]); // 应该用Q而不是N
如果Q和N不一样,这里要么释放了不存在的元素(导致段错误),要么没释放完所有内存(内存泄漏)。
3. 第一个scanf的多余换行符
scanf("%d\n", &N);里的\n会让scanf等待下一个空白字符才结束,可能导致后续输入异常,改成scanf("%d", &N);就好。
解答你的几个疑问
1. 如何多次动态分配二维数组的内存?
其实你第一次分配str的方式是完全正确的:
- 第一步:先分配一个指针数组(
char**类型),长度是需要的字符串数量(N或Q) - 第二步:遍历这个指针数组,给每个指针单独分配字符串的内存空间
第二次分配qry_str只需要照搬这个逻辑,注意用对应长度(Q)就行,就像上面修正的代码那样。
2. 是否需要先释放内存才能再次使用?
分两种情况:
- 如果是创建新的指针变量(比如你的
str和qry_str是两个独立变量),完全不需要释放之前的内存再分配新的,它们是分开的内存块,互不影响。 - 如果是复用同一个指针变量(比如想把
str重新用来存第二个数组),那必须先释放str之前的所有内存(先释放每个字符串,再释放指针数组),然后再重新分配,否则会造成内存泄漏,甚至指针混乱。
3. 这是GCC编译器的问题吗?
绝对不是!所有问题都是代码逻辑错误导致的,换任何标准C编译器都会出现同样的问题。
修正后的完整代码
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #define MAX_STRING_SIZE 20 int main() { int N, Q; int i, j, l, m, k, x; char **str; // 修正:去掉scanf里的\n scanf("%d", &N); str = (char **)malloc(sizeof(char *) * N); for(i = 0; i < N; i++){ str[i] = malloc(MAX_STRING_SIZE * sizeof(char)); scanf("%s",str[i]); } printf("%d\n",N); for(j = 0; j < N; j++){ printf("%s\n",str[j]); } scanf("%d",&Q); printf("%d\n",Q); char **qry_str; qry_str = (char **)malloc(sizeof(char *) * Q); // 修正:给qry_str[l]分配内存,不是qry_str本身 for(l = 0; l < Q; l++){ qry_str[l] = malloc(MAX_STRING_SIZE * sizeof(char)); scanf("%s",qry_str[l]); } // 修正:遍历Q次,不是N次 for(m = 0; m < Q; m++){ printf("%s\n",qry_str[m]); } // 释放str for(k = 0; k < N; k++) free(str[k]); free(str); // 修正:释放Q次,不是N次 for(x = 0; x < Q; x++) free(qry_str[x]); free(qry_str); return 0; }
内容的提问来源于stack exchange,提问作者Amuly Pandey
相关产品推荐
相关产品推荐

