这段C程序为什么无法运行
#include<stdio.h>void GetMemory(char *p){ p=(char *)malloc(100);}void Test(void){ char *str; GetMemory(str); strcpy(str,"hello world"); printf(str);}void main(){ Test();}#include<stdio.h>void GetMemory(char *p){ p=(char *)malloc(100);}void Test(void){ char *str; GetMemory(str); strcpy(str,"hello world");//这样是不行的。“hello world”是常量来的。你需要在之申请一个字符指针来保存的。 printf(str);}void main(){ Test();}
[解决办法]
#include<stdio.h>
void GetMemory(char **p)
{
*p=(char *)malloc(100);
}
void Test(void)
{
char *str;
GetMemory(&str);
strcpy(str,"hello world");
printf(str);
}
void main()
{
Test();
}
[解决办法]
void GetMemory(char *p)
{
p=(char *)malloc(100); //只是给形参p赋值了一个地址 并不是Test中的str
}
[解决办法]
GetMemory(str);
也错了。。内存没有申请成功
[解决办法]
楼主,
1 在 GetMemory 中形参为 char *p, 而函数内使用 p, 这种情况基本上就是错误的,形参是局部于函数的,正常情况下是 *p ……, 这样改变的是指向的内容,但是也可以用 return 把这个局部变量返回,这样也是可以的。所以有两种修改 GetMemory 的方法。
2 另外在动态内存分配后一般要验证是否分配成功,这是好的编程习惯之一。
我贴一段代码:
#include <stdio.h>#include <stdlib.h>char * GetMemory(char *p) { p = (char *)malloc(100); if (NULL == p) { // 验证动态内存是否分配成功 printf("malloc error!\n"); exit(EXIT_FAILURE); // 使用 EXIT_FAILURE 提高可移植性 } return p;}void Test(void) { char *str; str = GetMemory(str); strcpy(str, "Hello World!"); printf(str);} int main(void) { Test(); return 0;}
[解决办法]
以前有本好像叫做 高质量c编程的书,专门有讨论这个问题!