| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1598 人关注过本帖
标题:一道C题目引出来的困惑.
只看楼主 加入收藏
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:3 
回复 18楼 wangchengbin
以程序进行说话,理解一下偶第一行的说明,然后想想下面的一个简单的交换程序,思考一下结果,运行一下。
任何时候,编译器都会准确的告诉你的运算结果,不能想当然,
在不确定的时候,可以用printf打印一下值,比如说你在strcpy之前,你打印一下str指向哪里就会明白。


#include<stdio.h>
#include<stdlib.h>

//两段函数,你认为哪个可以交换两个数??
void swap1(int *a, int *b)
{
    int *temp;

    temp = a;
    a = b;
    b = temp;
}

void swap2(int *a, int *b)
{
    int temp;

    temp = *a;
    *a = *b;
    *b = temp;
}

int main(int argc, char **argv)
{
    int c = 3, d = 5;
   
    swap1(&c, &d);
    printf("c = %d, d = %d\n", c, d); //交换了么?没有!!
   
    swap2(&c, &d);
    printf("c = %d, d = %d\n", c, d); //交换了么?交换了!!
   
    return 0;
}

这个例子和你刚才的问题都是一回事,如果你能理解这个例子,那么也能理解为什么你的代码用了指针,但还是没有得到那块函数内分配的内存。
另外,你的程序结束时没有释放内存。

[ 本帖最后由 hellovfp 于 2012-7-8 12:22 编辑 ]

我们都在路上。。。。。
2012-07-08 12:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
也可以改成这样的:

程序代码:
#include <cstdio>
#include <memory>
#include <cstdlib>
#include <conio.h>

void getmemory(char* p[])
{
    *p = (char*) malloc(100);
    memset(*p, 0, sizeof(*p));
}

void main(void)
{
    char* str = NULL;
    getmemory(&str);
    memcpy(str, "hello world", 12);
    printf(str);
    _getch();
    free(str);
}

授人以渔,不授人以鱼。
2012-07-08 12:43
long0042
Rank: 2
等 级:论坛游民
帖 子:38
专家分:50
注 册:2008-3-5
收藏
得分:3 
程序代码:
#include <stdio.h>
#include <stdlib.h>

void getMemory(char **buffer, int size)
{
    *buffer = (char *)malloc(size * sizeof(char));
}


int main()
{
    char *buf = NULL;
    const char *str = "hello world";

    getMemory(&buf, strlen(str) + 1);
    strcpy(buf, str);
    printf("%s\n", buf);

    if (buf != NULL)
        free(buf);

    return 0;
}
非要想传指针分配内存就用二级指针, 不过这样设计都不好。里面分配内存,外面释放。如果程序大了,难免会忘掉释放内存。
2012-07-09 11:12
the_27th
Rank: 2
等 级:论坛游民
帖 子:29
专家分:29
注 册:2012-7-10
收藏
得分:3 
建议你用一个循环调用int f(int *a)试试
2012-07-10 21:22
jeclove
Rank: 1
等 级:新手上路
帖 子:1
专家分:3
注 册:2012-7-10
收藏
得分:3 
我还真是小白啊,看来路还远
2012-07-10 21:54
快速回复:一道C题目引出来的困惑.
数据加载中...
 
   



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

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