#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> int main(void) { int i=0, j,k; char t[100] = { 0 }; char *a[100]; char b[100] = { 0 }; scanf("%s", b); while (b[0]!='#') { a[i] = (char*)malloc(sizeof(char) * (strlen(b) + 1)); if(a[i]!=NULL) //这块的if是为了消除C6387的警告:这个警告的意思是,(以下是举例情况)文件指针"fp"可能是空指针,对于一些函数来说, strcpy(a[i], b); //传入空指针是致命的(如free()释放内存函数)。所以,该警告旨在提醒你应在执行fclose()函数前,排除空指针传入函数的可能。 //因此,在fclose()前加上判断 if(fp == NULL) return 0; 如果文件指针为空指针,则返回0。 i++; scanf("%s", b); } for (j = 0; j < i; j++) { for (k = j + 1; k < i; k++) { if (strlen(a[k])<strlen(a[j])) { strcpy(t, a[j]); strcpy(a[j], a[k]); strcpy(a[k], t); } } } for (j = 0; j < i - 1; j++) { printf("%s ", a[j]); } printf("%s", a[j]); free(a[j]); printf("nihao"); return 0; }
时间: 2024-01-14 16:04:36 浏览: 82
这段代码的功能是输入一些字符串,然后按照字符串长度从小到大排序并输出。在这段代码中,主要的问题是释放内存的方式不正确,具体来说:
1. 在释放内存时,只释放了最后一个字符串所占用的内存,而没有释放其他字符串所占用的内存。这样会导致其他字符串占用的内存没有被释放,出现内存泄漏的问题。
2. 在释放内存时,释放的顺序不对。应该先释放每个字符串所占用的内存,然后再释放字符指针数组所占用的内存。这样可以避免出现悬空指针的问题。
针对上述问题,代码应该做出如下修改:
1. 在释放内存时,应该使用循环逐个释放每个字符串所占用的内存。
2. 在释放内存时,应该先释放每个字符串所占用的内存,然后再释放字符指针数组所占用的内存。
修改后的代码如下所示:
```c
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
int i=0, j,k;
char t[100] = { 0 };
char *a[100];
char b[100] = { 0 };
scanf("%s", b);
while (b[0]!='#')
{
a[i] = (char*)malloc(sizeof(char) * (strlen(b) + 1));
if(a[i]!=NULL) {
strcpy(a[i], b);
i++;
}
scanf("%s", b);
}
for (j = 0; j < i; j++)
{
for (k = j + 1; k < i; k++)
{
if (strlen(a[k])<strlen(a[j]))
{
strcpy(t, a[j]);
strcpy(a[j], a[k]);
strcpy(a[k], t);
}
}
}
for (j = 0; j < i - 1; j++)
{
printf("%s ", a[j]);
free(a[j]);
}
printf("%s", a[j]);
free(a[j]);
printf("nihao");
return 0;
}
```
阅读全文