以下是引用zmf876870302在2017-3-27 08:04:10的发言:
这里的确有问题,已把语句改过来,但是还是出现该内存不能为“written”!主要是解决为什么会出现该内存不能为“written”或“read”原因?因为近段学编C语言程序,老出这问题,代码反复修改。也没解决这问题!
这里的确有问题,已把语句改过来,但是还是出现该内存不能为“written”!主要是解决为什么会出现该内存不能为“written”或“read”原因?因为近段学编C语言程序,老出这问题,代码反复修改。也没解决这问题!
按上述改了一下测试暂未见异常
改后代码,被注释了的语句为修改部分代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define BUF_LEN 101
#define CAP 5
int main(void)
{
char buf[BUF_LEN];
bool sorted = false;
unsigned int count = 0;
char *pTemp = NULL;
unsigned int capacity = CAP;
//char *pS = (char*)calloc(capacity, sizeof(char));
char **pS = (char**)calloc(capacity, sizeof(char*));
if(!pS)
{
printf("内存不足!\n");
return 1;
}
printf("这是可以读入任意个英语谚语,并将它们以字长顺序由短到长地输出的程序!\n");
printf("最后以 END 为结束标志!\n");
printf("注意:输入的每条英语谚语不超过 %d 个字节(包括空格、标点符号),不然会少一截!\n", BUF_LEN - 1);
while(true)
{
char buf[BUF_LEN] = "\0";
printf("请输入第 %u 条英语谚语(按 Enter 结束输入):\n", count + 1);
printf("\t%u>.\t ", count + 1);
fgets(buf, BUF_LEN, stdin);
if(strcmp(buf, "END\n") == 0)
break;
else
{
pS[count] = (char*)malloc(BUF_LEN);
if(!pS[count])
{
printf("申请内存不成功!\n");
return 2;
}
strcpy(pS[count], buf);
++count;
}
if(count == capacity)
{
capacity += CAP;
//pTemp = (char*)realloc(pS, capacity * sizeof(char));
//if(!pTemp)
pS = (char**)realloc(pS, capacity * sizeof(char*));
if(!pS)
{
printf("没有分配内存!\n");
return 3;
}
//pS = pTemp;
}
}
while(!sorted)
{
sorted = true;
int i = 0;
for(i = 0; i < count - 1; ++i)
{
if(strlen(pS[i]) > strlen(pS[i + 1]))
{
sorted = false;
pTemp = pS[i];
pS[i] = pS[i + 1];
pS[i + 1] = pTemp;
}
}
}
printf("\n以下是将你输入的英语谚语以字长由短到长的输出!\n");
int j = 0;
for(j = 0; j < count; ++j)
{
printf("\t%d>.\t%s\n", j + 1, pS[j]);
free(pS[j]);
pS[j] = NULL;
}
free(pS);
pS = NULL;
return 0;
}