| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1598 人关注过本帖
标题:一道C题目引出来的困惑.
只看楼主 加入收藏
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
//因为你的p只是函数参数,拷贝了一份指针变量,函数结束时函数外的str指针依然指向NULL。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* getmemory(char *p)
{
  p = (char *) malloc(100);
  return p;
}
int main()
{
    char *str = NULL;
    str = getmemory(str);
    strcpy(str,"hello world");
    printf(str);
    free(str);
    return 0;
}

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

我们都在路上。。。。。
2012-07-08 10:47
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 10楼 TonyDeng
又开始瞎掰了不是。strcpy什么时候做字符串拼接了?那是strcat。

楼上说对了,是参数传递的问题。解决方法要么如楼上所说返回指针,要么将参数改成二级指针通过参数传递返回值。

重剑无锋,大巧不工
2012-07-08 10:55
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 10楼 TonyDeng
大概知道你的意思,如果在strcpy(str,"hello world\0");加个\0也是不行的.我在VC上试了.           

#include<stdafx.h>
 #include<stdio.h>
 #include<string.h>
 #include<stdlib.h>
 void getmemory(char *p)
 {
   p=(char *) malloc(100);
 }
 void main(void)
 {
     char *str=NULL;
     getmemory(str);
     strcpy(str,"hello world");
     printf(str);
 }
2012-07-08 10:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这是给你改过的:

程序代码:
void main(void)
{
    char* str = (char*) malloc(100);
    memset(str, 0, sizeof(str));
    strcpy(str, "hello world");
    printf(str);
    _getch();
    free(str);
} 

授人以渔,不授人以鱼。
2012-07-08 10:59
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 14楼 TonyDeng
memset(str, 0, sizeof(str)); 这是什么函数? 什么作用
2012-07-08 11:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wangchengbin在2012-7-8 11:02:18的发言:

memset(str, 0, sizeof(str)); 这是什么函数? 什么作用

用0填充分配得到的str内存。不同的alloc()分配方式,是否替你初始化是难以确定的,最好自己手动做一次。本来就你的目标来说,*str = '\0'就够了,但不妨做全面一些。

授人以渔,不授人以鱼。
2012-07-08 11:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
strcpy()是操作字符串的函数,就该使用合法的字符串,如果不区分概念,将字符串当内存使用,就请使用memcpy(),不要用strcpy()。学C的人最容易养成的一种坏习惯就是概念混乱,字符与整数不分之类就是典型。

授人以渔,不授人以鱼。
2012-07-08 11:14
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 11楼 hellovfp
#include<stdio.h>
 #include<string.h>
 #include<stdlib.h>
 char* getmemory(char *p)
 {
   p = (char *) malloc(100);
   return p;
 }
 int main()
 {
     char *str = NULL;
     str = getmemory(str);
     strcpy(str,"hello world");
     printf(str);
     return 0;
 }
我认为  调用str = getmemory(str);就可以等到100字节的空间吧,因为是指针 怎么还需要return p;?  

2012-07-08 11:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
11楼的修改是对的,不返回你无法得到分配的空间地址。只是你这样使用一个函数是多余的,所以我直接删了。

授人以渔,不授人以鱼。
2012-07-08 11:24
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:3 
唉,memset(str, 0, sizeof(str));这句有什么意义?Tony,你觉得sizeof(str)的值是多少?
。。。。。。

重剑无锋,大巧不工
2012-07-08 11:32
快速回复:一道C题目引出来的困惑.
数据加载中...
 
   



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

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