| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6294 人关注过本帖
标题:新手求助!运行C语言程序时,出现该内存不能为“written”!是哪里出问题? ...
只看楼主 加入收藏
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:20 
以下是引用zmf876870302在2017-3-27 08:04:10的发言:

这里的确有问题,已把语句改过来,但是还是出现该内存不能为“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;
}
收到的鲜花
  • zmf8768703022017-03-27 12:49 送鲜花  3朵   附言:我很赞同
2017-03-27 08:14
zmf876870302
Rank: 3Rank: 3
来 自:福建
等 级:论坛游侠
威 望:3
帖 子:50
专家分:199
注 册:2017-3-26
收藏
得分:0 
回复 21楼 吹水佬
谢谢你!问题得到解决了。可否再问一下,
//char *pS = (char*)calloc(capacity, sizeof(char));
 char **pS = (char**)calloc(capacity, sizeof(char*));

 //pTemp = (char*)realloc(pS, capacity * sizeof(char));
            //if(!pTemp)
            pS = (char**)realloc(pS, capacity * sizeof(char*));
            if(!pS)
            {
                printf("没有分配内存!\n");
                return 3;
            }

            //pS = pTemp;
为什么要这么改?我原先写法有怎么错了?这方面是涉及分配内存哪个知识点?我要去哪里了解?谢谢!

还在学习过程中,欢迎指教!
2017-03-27 11:58
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 22楼 zmf876870302
之前都讨论过,重温一下12楼后的贴。
2017-03-27 14:59
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
程序代码:
if(strlen(pS[i]) > strlen(pS[i + 1]))
{
       sorted = false;
       pTemp = pS[i];
       pS[i] = pS[i + 1];
       pS[i + 1] = pTemp;
}复制字符串不能这样来。

 pS[count] = (char*)malloc(BUF_LEN);
你得弄一个二级指针


程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <stdbool.h>
#include <iostream>

#define   BUF_LEN      101
#define   CAP            5

int main(void)
{
    char buf[BUF_LEN];
    bool sorted = false;
    unsigned int count = 0;  //
    char pTemp[BUF_LEN];

    unsigned int capacity = CAP;
    //char *pS = (char*)calloc(capacity, sizeof(char));
    char **pS = (char**)calloc(capacity, sizeof(char*));
    //*pS = (char*)calloc(BUF_LEN, 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*sizeof(char));
            if (!pS[count])
            {
                printf("申请内存不成功!\n");
                return 2;
            }

            strcpy(pS[count], buf);
            ++count;
        }

        if (count == capacity)
        {
            capacity += CAP;
            pS = (char**)realloc(pS, capacity * sizeof(char*));
            if (!pS)
            {
                printf("没有分配内存!\n");
                return 3;
            }

            //pS = pTemp;
        }
    }
  //  system("pause");
    while (!sorted)
    {
        sorted = true;

        int i = 0;
        for (i = 0; i < count - 1; ++i)
        {
            if (strlen(pS[i]) > strlen(pS[i + 1]))
            {
                sorted = false;
                strcpy(pTemp, pS[i]);
                strcpy(pS[i], pS[i + 1]);
                strcpy(pS[i + 1],pTemp);
                //pTemp = pS[i];
                //pS[i] = pS[i + 1];
                //pS[i + 1] = pTemp;
            //    system("pause");
            }
        }
    }

    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;
}


[此贴子已经被作者于2017-4-23 14:20编辑过]


早知做人那么辛苦!  当初不应该下凡
2017-04-23 14:19
快速回复:新手求助!运行C语言程序时,出现该内存不能为“written”!是哪里出问 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019988 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved