C语言复习之malloc和realloc(为字符串数组分配内存)
Posted 你是小KS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言复习之malloc和realloc(为字符串数组分配内存)相关的知识,希望对你有一定的参考价值。
1.声明
当前内容主要为本人复习C语言的内存分配以及部分指针的内容
主要包含:
- malloc+realloc方式扩容字符串数组
- malloc+malloc方式扩容字符串数组
- 释放内存free
2.基本demo
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_CHAR_LEN 15
// 填充字符串数组
void input_string_array(char (*p)[MAX_CHAR_LEN], int len) {
for (int i = 0; i < len; i++) {
printf("请输入第(%d)个字符串:", (i + 1));
scanf("%s", p[i]);
}
}
// 打印字符串数组
void print_string_array(char (*p)[MAX_CHAR_LEN], int len) {
for (int i = 0; i < len; i++) {
printf("第(%d)个字符串:%s\\n", (i + 1), p[i]);
}
}
int malloc_way_to_change() {
char (*p)[MAX_CHAR_LEN];// 字符数组的指针,即用来存放多个字符串
char (*newP)[MAX_CHAR_LEN];
size_t charSize = sizeof(char);
int num;
printf("请输入字符串个数:");
scanf("%d", &num);
//printf("\\n");
if (num <= 0)return 0;
// 开始内存申请
p = (char (*)[MAX_CHAR_LEN]) malloc(num * MAX_CHAR_LEN * charSize);
// 如果p为null那么表示申请内存失败
if (p == NULL) {
printf("内存空间分配失败.\\n");
return 0;
}
// 读取输入的字符串
input_string_array(p, num);
// 打印当前输入的字符串数组
print_string_array(p, num);
// 是否重新分配字符
printf("***重新分配字符串的个数***");
num = num + 1;
printf("num=%d\\n", num);
newP = (char (*)[MAX_CHAR_LEN]) malloc(num * MAX_CHAR_LEN * sizeof(char));
printf("***申请内存成功***");
// 复制原来的东西
for (int i = 0; i < num - 1; i++) {
strcpy(newP[i], p[i]);
printf("%s %s", newP[i], p[i]);
}
printf("复制完成!\\n");
free(p);
printf("释放原来的p中的内存空间完成!\\n");
p = newP; // 将当前p指向新的地址
printf("将当前的p的地址指向newP的地址!\\n");
printf("重新分配字符串的个数为%d\\n", num);
printf("请输入第(%d)个字符串:", num);
scanf("%s", *(p+num-1));// 小心这个地方,如果写成其他形式那么可能有问题
// 再次显示当前字符串中的内容
print_string_array(p, num);
// 最后一定要释放内存
free(p);
return 0;
}
// 采用malloc和realloc方式实现,当前字符串数组的扩容
int malloc_realloc_way_change_string_array() {
char (*p)[MAX_CHAR_LEN];// 字符数组的指针,即用来存放多个字符串
size_t charSize = sizeof(char);
int num;
printf("请输入字符串个数:");
scanf("%d", &num);
if (num <= 0)return 0;
// 开始内存申请
p = (char (*)[MAX_CHAR_LEN]) malloc(num * MAX_CHAR_LEN * charSize);
// 如果p为null那么表示申请内存失败
if (p == NULL) {
printf("内存空间分配失败.\\n");
return 0;
}
// 读取输入的字符串
input_string_array(p, num);
// 打印当前输入的字符串数组
print_string_array(p, num);
// 是否重新分配字符
printf("***重新分配字符串的个数***");
num = num + 1;
printf("num=%d\\n", num);
p = (char (*)[MAX_CHAR_LEN]) realloc(p,num * MAX_CHAR_LEN * charSize);
//input_string_array(p,num);
// 这里应该手动输入第二个的值,但是无法赋值?
printf("请输入第(%d)个字符串:", num);
char input[MAX_CHAR_LEN];
scanf("%s", input);
input[MAX_CHAR_LEN-1]='\\0';
strcpy(*(p+num-1),input); // 使用strcpy(p[num],input) ;赋值错误,原因本身应该是字符串
/*input_string_array(p,num);*/
print_string_array(p, num);
// 最后一定要释放内存
free(p);
return 0;
}
int main() {
//return malloc_realloc_way_change_string_array();
return malloc_way_to_change();
}
其中需要注意的是
- 需要分配内存为
(num * MAX_CHAR_LEN * charSize);
,小心这个 - 为分配后的字符串数组的最后一位赋值:
strcpy(*(p+num-1),input);
(小心这个地址如果不正确是不会赋值的)
3.执行结果
4.总结
1.小心内存泄漏,一定要调用free方法
2.小心字符串数组的赋值问题(指针问题,指针就是c的灵魂)
以上是关于C语言复习之malloc和realloc(为字符串数组分配内存)的主要内容,如果未能解决你的问题,请参考以下文章
C:malloc/calloc/realloc/alloca内存分配函数
内存动态分配之realloc(),malloc(),calloc()与new运算符