【C语言】新手编程时常见BUG汇总,持续更新中

您所在的位置:网站首页 c语言程序设计常见错误有哪些方面 【C语言】新手编程时常见BUG汇总,持续更新中

【C语言】新手编程时常见BUG汇总,持续更新中

2024-07-13 17:41| 来源: 网络整理| 查看: 265

一.前言

    编程时候新手会遇到一些问题,我在这篇文章中把有代表性的码下来,并简单解释,欢迎大家和我多多交流.

二.正文

 

1.指针声明但为赋值,输入输出会出现错误

#include int main(){ int *p; scanf("%d",p); printf("%d",*p); }

看似没有问题的一个程序吧?但是却无法正确执行,是因为虽然对p指针进行了声明,但是没有赋予他内存空间,正确的写法应该改

int *p = (int*)malloc(sizeof(int));

即可正确执行。(至于malloc的作用以及如何填写malloc的参数,可以参看我的另一篇对malloc的详解)。

上面的大家应该都明白,但是下面这个,是同样的原理就有很多人犯糊涂

#include #include struct Node { int a; int b; }; int main() { struct Node *c[5]; c[0]->a = 1; }

这个程序无法正确执行,是为什么呢?因为c这个结构体指针数组也没有给他分配空间呀,所以出现的是一类问题。请大家要注意

#include #include typedef struct Node { int value1; int value2; }*p; struct graph { p a; }; int main() { struct graph* g = (struct graph *)malloc(sizeof(struct graph )); g->a->value1 = 5; }

   再看下这个代码我只需给graph申请空间,就可以直接操作Node了,因为graph结构体中有node,我申请了graph就自然给node也分配了内存空间

2.指针能否直接赋值?

typedef struct node { int data; struct node* next; }node; typedef struct linkList { int size=0; node* head; }linkList; /******* 这样一个普通的链表,省略建立赋值等操作 *******/ 能否有这样的操作? int main() { linkList* a,b; a = add(1,2,3,4,5);//对a进行赋值1,2,3,4,5(伪代码) b = a;//能否这样干呢? a = change(1,2,3,4);//将a改为1,2,3,4(伪代码) print(b);//这时候打印b的结果是什么呢? }

我们把a赋值给b后,对a进行了更改,再打印b;那么b中的值应该是什么呢?是1,2,3,4,5还是1,2,3,4;答案是b和a永远保持一致,是1,2,3,4;在初次学习时候可能对此会有疑问,为什么会是这样的呢?原因是b和a都是指针指向的都是同一块内存地址。b=a后b和a指向了同一个内存地址,这时候a变化了后,打印b时,打印的是相同的一片空间。这下明白了吧?

 

 

3.scanf gets?puts printf?

#include int main() { char str1[50]; scanf("%s",str1); printf("%s",str1); }

执行上述代码输入字符串时候如果有空格,则会导致字符串断掉,不能正确的录入空格,如下图所示的情况:

解决方法是实用GETS函数。即可接纳空格,

#include int main() { char str1[50]; gets(str1); printf("%s",str1); }

printf("%s",str)和puts(str)在字符串输出方面没有任何区别,不需要在此进行区分。

 

 

4.未完待续



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3