|
|
发表于 2006-1-9 13:06:49
|
显示全部楼层
Post by sleepwalker
可是下面一个例子却是可以正确运行:
2,void getmemory(char **p)
{
*p = (char*)malloc(100);
}
void test(void)
{
char *str = NULL;
getmemory(&str);
strcpy(str, "hello);
printf(str);
}
我不明白的是两个例子中函数的形参都是指针,只是一个是指针,一个二重指针,为什么一个不可以传递动态内存,而另一个就可以呢?
另外,我发现,若在第二个版本的getmemory函数里面对p所指的内存区进行写操作,比如strcpy,则程序依然会崩溃,这个时候str指针依然是null。
百思不得其原因所在,还请兄弟们解惑
指出你的一个笔误: printf(str) 这样的参数会让printf 以为 str是格式字串。printf 由于可以接受可变参数,所以C实现里头不会检查其参数个数和参数类型,但会保证第一个实参为格式字串。
我下面的代码没发现你说的崩溃问题。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void getmemory(char **p)
- {
- *p = (char*)malloc(10);
- printf("*p addr:%d\n",*p);
- strcpy(*p,"world\0");
- printf("*p content:%s\n",*p);
- }
- void test(void)
- {
- char *str = NULL;
- printf("str addr:%d\n", str);
- getmemory(&str);
- printf("str addr:%d\n", str);
- strcpy(str, "hello\0");
- printf("str content:%s\n",str);
- free(str);
- }
- int main()
- {
- test();
- }
复制代码 |
|