求详细解释malloc动态分配的过程~下面是一段代码: 20
#include<stdio.h>#include<stdlib.h>#include<string.h>/*该二级指针用于指向n个字符串的首地址表头*/char**st...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*该二级指针用于指向n个字符串的首地址表头*/
char ** str;
char cache[101];
void Bubble_Sort(int n)
{
int i,j;
for(i = 0;i < n;i++)
{
for(j = 0;j < n - i - 1;j++)
{
if(strlen(str[j + 1]) < strlen(str[j]))
{
strcpy(cache,str[j]);
strcpy(str[j],str[j + 1]);
strcpy(str[j + 1],cache);
}
}
}
}
int main()
{
int n;
int fact;
int i;
while(scanf("%d",&n) != EOF)
{
getchar();
str = (char **)malloc(n *101 * sizeof(char));//A代码段,申请n个长度为100的串
fact = 0;
for(i = 0;i < n;i++)
{
str[i] = (char *)malloc(101 * sizeof(char));//B代码段,申请1个长为100的串
gets(cache);
if(strcmp(cache,"stop") == 0) break;
fact++;
strcpy(str[i],cache);
//printf("len= %d\n",strlen(str[i]));
//puts(*str);
}
/*排序*/
Bubble_Sort(fact);
for(i = 0;i < fact;i++)
{
puts(str[i]);
}
for(i = 0;i < fact;i++)
{
free(str[i]);
}
free(str);
}
return 0;
}
//首先我后面这个表述正确吗?:(char **s相当于申请了一个可以动态分配字符串个数的字符串数组)
//我想问的是:我们已经看到首先A段代买申请了一块大的内存,但是B段代码又在堆中重新申请的内存空间是在A段代码已经申请的空间中申请的么?还是自己单独申请的?
原题题目是:
首先输入你要输入的字符串的个数。然后换行输入该组字符串。每个字符串以回车结束,每个字符串少于一百个字符。
如果在输入过程中输入的一个字符串为“stop”,也结束输入。
然后将这输入的该组字符串按每个字符串的长度,由小到大排序,按排序结果输出字符串。
题目要求:根据输入的字符串个数来动态分配存储空间(采用malloc函数)。每个字符串会少于100个字符。 展开
#include <stdlib.h>
#include <string.h>
/*该二级指针用于指向n个字符串的首地址表头*/
char ** str;
char cache[101];
void Bubble_Sort(int n)
{
int i,j;
for(i = 0;i < n;i++)
{
for(j = 0;j < n - i - 1;j++)
{
if(strlen(str[j + 1]) < strlen(str[j]))
{
strcpy(cache,str[j]);
strcpy(str[j],str[j + 1]);
strcpy(str[j + 1],cache);
}
}
}
}
int main()
{
int n;
int fact;
int i;
while(scanf("%d",&n) != EOF)
{
getchar();
str = (char **)malloc(n *101 * sizeof(char));//A代码段,申请n个长度为100的串
fact = 0;
for(i = 0;i < n;i++)
{
str[i] = (char *)malloc(101 * sizeof(char));//B代码段,申请1个长为100的串
gets(cache);
if(strcmp(cache,"stop") == 0) break;
fact++;
strcpy(str[i],cache);
//printf("len= %d\n",strlen(str[i]));
//puts(*str);
}
/*排序*/
Bubble_Sort(fact);
for(i = 0;i < fact;i++)
{
puts(str[i]);
}
for(i = 0;i < fact;i++)
{
free(str[i]);
}
free(str);
}
return 0;
}
//首先我后面这个表述正确吗?:(char **s相当于申请了一个可以动态分配字符串个数的字符串数组)
//我想问的是:我们已经看到首先A段代买申请了一块大的内存,但是B段代码又在堆中重新申请的内存空间是在A段代码已经申请的空间中申请的么?还是自己单独申请的?
原题题目是:
首先输入你要输入的字符串的个数。然后换行输入该组字符串。每个字符串以回车结束,每个字符串少于一百个字符。
如果在输入过程中输入的一个字符串为“stop”,也结束输入。
然后将这输入的该组字符串按每个字符串的长度,由小到大排序,按排序结果输出字符串。
题目要求:根据输入的字符串个数来动态分配存储空间(采用malloc函数)。每个字符串会少于100个字符。 展开
1个回答
展开全部
malloc 看The C programming language就能知道了
malloc 申请一段内存 例如申请100 实际申请100 加上一个指针(指向下一个空闲块)和一个申请的size(这里就是100)
成功后 就把数据区地址返回
所以你的malloc(n *101 * sizeof(char))只是申请了一长段内存
B段代码再次申请 和A段代码 没关系
你该做的是每次新的一行 malloc(100) 用链表将返回值保存 用于最后销毁
malloc 申请一段内存 例如申请100 实际申请100 加上一个指针(指向下一个空闲块)和一个申请的size(这里就是100)
成功后 就把数据区地址返回
所以你的malloc(n *101 * sizeof(char))只是申请了一长段内存
B段代码再次申请 和A段代码 没关系
你该做的是每次新的一行 malloc(100) 用链表将返回值保存 用于最后销毁
追问
可是我这段代码是通过题目了呀,请问是为什么呢?既然他们没有关系,我这个题目中A和B就没有关联,说明代码错误就不会通过。
追答
你没有弄懂指针和数组,你的str 申明char**的话,你怎么混用str[],数组在被编译器退化成指针但是不能以为着指针和数组就相等。所以你的用法str[x],该用*(str+x)。
至于你的结果是对的,那是因为,你的malloc(n *101 * sizeof(char))的数据区前n个char充当了链表的作用,就是你开辟的n个长为100的串的起始地址(访问他们使用*(str+x))
你可以用断点后查看str 的值的变化
你明白char**的意思的话,不该有这种奇怪的想法。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询