搜索
bottom↓
回复: 105

大家说来说C语言的缺点

  [复制链接]

出0入0汤圆

发表于 2014-11-29 09:32:19 | 显示全部楼层 |阅读模式
我就感觉这个特不方便。
1.我发现,要定义一个数组或是字符串,最好要定义数组的大小,不然,如果后面要用指针来操作这个数组,没办法知道  数组大小,整个程序就OVER。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-11-29 09:37:03 | 显示全部楼层
1、siziof 不知道能不能满足需要
2、能力有限不能给出更多的答案。

出0入0汤圆

 楼主| 发表于 2014-11-29 09:56:41 | 显示全部楼层
彼岸花开@ 发表于 2014-11-29 09:37
1、siziof 不知道能不能满足需要
2、能力有限不能给出更多的答案。

sizeof 只能统计数组 大小

我觉得一但指针被初始化后,指针指向的东西就是有大小的了

出0入0汤圆

发表于 2014-11-29 10:03:23 | 显示全部楼层
楼主发错版块了吧  ,这里是飞思卡尔专区  

出100入101汤圆

发表于 2014-11-29 10:06:04 | 显示全部楼层
LZ这个问题和C语言是否有缺陷无关。

出0入0汤圆

发表于 2014-11-29 10:12:01 | 显示全部楼层
个人觉得c语言时序要求不高的地方还是挺方便的

出0入0汤圆

发表于 2014-11-29 10:12:08 | 显示全部楼层
这个是指针的强大之处,要好好的用!!

出0入0汤圆

发表于 2014-11-29 10:15:16 | 显示全部楼层
wind2100 发表于 2014-11-29 09:56
sizeof 只能统计数组 大小

我觉得一但指针被初始化后,指针指向的东西就是有大小的了 ...

1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计数组的大小。是这个数组中已经有被填充的大小吧。。因为数组是未定义大小的,所以数组的大小还是有可以一直增加的。 我的理解对不对呢
2、用指针操作数组,如果发生越界。确实很严重。。  
3、用指针的时候能不能判断一下 ,数组的最后总是'\0' 结束嘛。。这个我没有尝试过。

出100入101汤圆

发表于 2014-11-29 10:18:44 | 显示全部楼层
彼岸花开@ 发表于 2014-11-29 10:15
1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计 ...

数组大小是定义是确定的,貌似不能一直增加。至于用指针去访问数组的越界问题,那是软件设计的问题,和数组、c语言无关。

出0入0汤圆

发表于 2014-11-29 10:21:01 | 显示全部楼层

指针正是C语言的强大之处,楼主说的这个不是C语言的不足之处,而在于使用指针的人

出0入17汤圆

发表于 2014-11-29 10:24:55 | 显示全部楼层
wind2100 发表于 2014-11-29 09:56
sizeof 只能统计数组 大小

我觉得一但指针被初始化后,指针指向的东西就是有大小的了 ...

在定义指针的时,指针指向的东西就有大小。
比如 char* p, sizeof(*p)也只能是一个char

如果你想sizeof(*p)返回一个数组的大小,那么可以自定义之中类型
typedef struct
{
char str[10];
}
Str_TypeDef;

这是定义Str_TypeDef * p,  此时sizeof(*p),就是数组str[]的大小了。


出0入8汤圆

发表于 2014-11-29 10:26:07 | 显示全部楼层
wind2100 发表于 2014-11-29 09:56
sizeof 只能统计数组 大小

我觉得一但指针被初始化后,指针指向的东西就是有大小的了 ...

给你提供个伪代码:
  1. ArrayCount = sizeof(Array) / sizeof(Array[0]);
复制代码

出0入17汤圆

发表于 2014-11-29 10:30:25 | 显示全部楼层
彼岸花开@ 发表于 2014-11-29 10:15
1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计 ...

数组和字符串混了。

数组里面的数据可以任意,并不是\0结尾
字符串才是\0结尾。

如果想用数组放字符串“www”,数组至少要定义成4个字节,第四个字节用来放'\0'

出0入0汤圆

发表于 2014-11-29 10:31:56 | 显示全部楼层
指针,运用的好就是神器,非常好用,实用。但是运用不好 对整个系统来说 就是灾难。
任何东西都有利有弊,看怎么运用了。

出0入0汤圆

发表于 2014-11-29 10:34:33 | 显示全部楼层
wicy001 发表于 2014-11-29 10:30
数组和字符串混了。

数组里面的数据可以任意,并不是\0结尾

1、 谢谢指点。确实弄错了、

出0入17汤圆

发表于 2014-11-29 10:43:00 | 显示全部楼层
本帖最后由 wicy001 于 2014-11-29 10:44 编辑
彼岸花开@ 发表于 2014-11-29 10:34
1、 谢谢指点。确实弄错了、


刚才只注意第三条了。
你说的第一点,也不准确,
我们常说的定义数组,都是指静态数组, 数组定义了,其大小就不能变了。

有一个概念是动态数组,就是堆,是calloc或malloc来申请。

出0入0汤圆

发表于 2014-11-29 11:05:46 | 显示全部楼层
wicy001 发表于 2014-11-29 10:43
刚才只注意第三条了。
你说的第一点,也不准确,
我们常说的定义数组,都是指静态数组, 数组定义了,其 ...

1、 对于静态数组。 他的长度在定义数组后,就确实了。
          使用静态数组。方法一:是定义数组时同时定义数组的长度,同时给这个数组赋初值。这种不太常用。方法二:定义数组的时候不定义数组的长度,但是给数组初值。
                                方法三:定义数组的同时。定义数组的长度,但不给数组赋初值。这三种方法都能编译通过。方法四:定义数组的同时。不定义数组的长度也不给数组赋初值。。keil5 编译失败。
                                方法四编译不通过。也说明了静态数组在定义后,数组长度就就确定了
2 、明白了动态数组是申请内存来了。我的第一点,将静态数组和动态数组搞混了

出0入0汤圆

发表于 2014-11-29 11:17:28 | 显示全部楼层
1米49 发表于 2014-11-29 10:31
指针,运用的好就是神器,非常好用,实用。但是运用不好 对整个系统来说 就是灾难。
任何东西都有利有弊, ...

     指针,C语言的利器。学好不容易。

出0入17汤圆

发表于 2014-11-29 11:19:08 | 显示全部楼层
彼岸花开@ 发表于 2014-11-29 11:05
1、 对于静态数组。 他的长度在定义数组后,就确实了。
          使用静态数组。方法一:是定义数组时同时定义 ...

勤奋好学,赞一个。

出0入0汤圆

发表于 2014-11-29 11:20:09 | 显示全部楼层
zhangchaoying 发表于 2014-11-29 11:17
指针,C语言的利器。学好不容易。

我也是会使用一点,都是参考别人,然后拿来用,其实像回调函数什么乱七八糟的,看的时候理解了,过段时间不用又忘记了,哎。
指向函数的指针,一直都没怎么用好

出0入0汤圆

发表于 2014-11-29 11:53:24 | 显示全部楼层
没有数组越界检测,没有内存自动回收。。。。

出0入0汤圆

发表于 2014-11-29 13:12:05 | 显示全部楼层
有时都不敢用指针

出0入0汤圆

 楼主| 发表于 2014-11-29 13:19:08 | 显示全部楼层
wicy001 发表于 2014-11-29 10:24
在定义指针的时,指针指向的东西就有大小。
比如 char* p, sizeof(*p)也只能是一个char

typedef struct tStr
{
   char strA[6];
   char strB[12];
}
Str_Type;


Str_Type Str={
"123","56789"
};

Str_Type *pStr=&Str;


int main(int argc, char *argv[])
{
        u16 i = 1;

   
   while(i--)
   {         
          printf("pStr===>%d \n",sizeof(pStr->strA));            
   }
   
        return 0;
}

打印结束 是 6  只是数组大小,并不是字符字节数。
按你的做法, 也不能统计到字节数,和定义数组大小一样。 先指定的大小。

出0入0汤圆

 楼主| 发表于 2014-11-29 13:22:00 | 显示全部楼层
其实我是想,能不能不定义数据的字节数,

实现,
char strA[]={"A2345"};
char strB[]={"B23456789A"};
char strC[]={"B23456789A123"};

超过8个字符,我要做一个左移,不超过的,不用左移

出0入0汤圆

 楼主| 发表于 2014-11-29 13:25:17 | 显示全部楼层
害得我,这样做了。
//=========================================================================================
typedef struct tStr
{

        u8 Size;
        const u8 * pStr;

}Str_Type;

const u8 StrGoodBye[]      ={"Good Bye"};



const Str_Type Str[]={
   
    {sizeof(StrGoodBye),StrGoodBye},

};

出0入0汤圆

 楼主| 发表于 2014-11-29 13:28:46 | 显示全部楼层
debian 发表于 2014-11-29 12:04
缺点是 不能面向对象

可以的哟,只要你能抽像出来。

C++ 也是架在C基础上的呀!

出0入17汤圆

发表于 2014-11-29 13:35:34 | 显示全部楼层
wind2100 发表于 2014-11-29 13:19
typedef struct tStr
{
   char strA[6];


数组的大小,和数组里存的数据个数,是两个不同的概念。

这种方法,只是针对你LZ位,说明用指针可以返回数组大小而已。 平时取数组大小,都是用12楼的方法。

现在才知道,你原来想取字符串的长度, 请用strlen()函数,用之前包含头文件<string.h>。

出0入17汤圆

发表于 2014-11-29 13:37:27 | 显示全部楼层
wind2100 发表于 2014-11-29 13:25
害得我,这样做了。
//=============================================================================== ...

百度 strlen 可以满足你。

你这基本功不扎实呀。

出0入0汤圆

发表于 2014-11-29 13:38:12 | 显示全部楼层
彼岸花开@ 发表于 2014-11-29 10:15
1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计 ...

完全错误, C语言不存在因为没定义大小就可以 随意增加数组大小的可能...

C89中不允许不指定数组大小的同时不给初始数据
C99允许, 但定义出的是0字节数组

另, C89数组只能静态定义大小, C99局部数组可以动态定义大小
但都不存在定义后直接增加的可能性...你这么做就是数组越界

出0入0汤圆

发表于 2014-11-29 13:39:39 | 显示全部楼层
世界上面没有什么东西是完美的.c语言也不例外,

出0入0汤圆

发表于 2014-11-29 13:40:45 | 显示全部楼层
指针和数组应该看用在什么地方 才能进行评价

出0入0汤圆

 楼主| 发表于 2014-11-29 13:41:23 | 显示全部楼层
chengz 发表于 2014-11-29 11:53
没有数组越界检测,没有内存自动回收。。。。

原来大家都喜欢 傻瓜式编程!

越界的事:我觉得可以在编译器上面动手脚,编译的时候知道,数组大小,data[100],  0-99   data[x]  如果x > 99  就跳过这一条指令。

函数退出来,你申请的动态内存就 释放了 ,但在PC上,free ,delete

出0入17汤圆

发表于 2014-11-29 13:44:17 | 显示全部楼层
选自百度, 把这几个例子弄懂了,应该可以满足你的要求

char* ss = "0123456789";
sizeof( ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符
大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数,内部实现是用一个循环计算到\0之前为止
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示在内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以'\0'结尾的
char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2

出45入88汤圆

发表于 2014-11-29 13:48:55 | 显示全部楼层
做了13年电子,写了13年C代码,感觉挺累的。

出0入0汤圆

 楼主| 发表于 2014-11-29 13:52:52 | 显示全部楼层
wicy001 发表于 2014-11-29 13:35
数组的大小,和数组里存的数据个数,是两个不同的概念。

这种方法,只是针对你LZ位,说明用指针可以返回 ...

一下忘记了,晕了。。。 多谢指点,这下子,多了一种办法了。

出0入0汤圆

发表于 2014-11-29 14:28:45 | 显示全部楼层
snoopyzz 发表于 2014-11-29 13:38
完全错误, C语言不存在因为没定义大小就可以 随意增加数组大小的可能...

C89中不允许不指定数组大小的同 ...

1、谢谢指出错误。。给出了C89 C99 的不得同。
2、在17 楼已经重新写了体会。如下:
                 1、 对于静态数组。 他的长度在定义数组后,就确实了。
                                          使用静态数组。方法一:是定义数组时同时定义数组的长度,同时给这个数组赋初值。这种不太常用。方法二:定义数组的时候不定义数组的长度,但是给数组初值。
                                方法三:定义数组的同时。定义数组的长度,但不给数组赋初值。这三种方法都能编译通过。方法四:定义数组的同时。不定义数组的长度也不给数组赋初值。。keil5 编译失败。
                                方法四编译不通过。也说明了静态数组在定义后,数组长度就就确定了
                2 、明白了动态数组是申请内存来了。我的第一点,将静态数组和动态数组搞混了

出0入0汤圆

发表于 2014-11-29 14:46:24 | 显示全部楼层
sizeof 不是函数,相当于宏,编译时展开。
其针对类型求解。如果 a 是数组,sizeof(a) 就是数组长度, 如果 a 是指针,那就是指针这个类型的长度。

出0入0汤圆

发表于 2014-11-29 14:48:21 | 显示全部楼层
彼岸花开@ 发表于 2014-11-29 14:28
1、谢谢指出错误。。给出了C89 C99 的不得同。
2、在17 楼已经重新写了体会。如下:
                 1、 对于静态数 ...

在MDK里人工加上-c99就应该可以定义没长度的数组也不给初值了...但此时数组长度是0

加了-c99也可以用动态数组,C99中的名字叫变长数组, 适用于局部数组变量, 其长度可以用一个变量来指定

另外用malloc 申请内存(分配在堆上), 也可以变向当数组来用, 但记得要free掉,
变长数组分配在栈上, 作用域一结束栈就自动还原了所以不用人工释放

出0入0汤圆

发表于 2014-11-29 14:52:17 | 显示全部楼层
snoopyzz 发表于 2014-11-29 13:38
完全错误, C语言不存在因为没定义大小就可以 随意增加数组大小的可能...

C89中不允许不指定数组大小的同 ...

局部数组动态大小。
学到了,我想应该是通过在栈上 SP-X, X 可变实现的。

出0入0汤圆

发表于 2014-11-29 16:54:15 | 显示全部楼层
本帖最后由 cddx 于 2014-11-29 17:43 编辑

不要忘了当初发明C语音是为了替代汇编语言写操作系统软件的,所以有些所谓的“缺点”并不是真正的缺点哦,她有一个重要假定就是编程员自己知道要干什么,只是后来C发展的太好了,以至于大家把它用在了几乎所有领域,还繁衍出一个庞大类C家族,C++、C#、java、python、objective-c、lua等。

出0入0汤圆

 楼主| 发表于 2014-11-29 17:05:49 | 显示全部楼层
OK   现在发现另一种办法了,辛苦了各位,希望大家都学到

#include <stdio.h>
#include <string.h>
#include “std.h”

typedef struct tStr
{
   char str[12];
}
Str_Type;


const Str_Type StrA[]={  //const
"123",
"56789",
"12356789"
};

Str_Type *pStr = (Str_Type *)StrA;


int main(int argc, char *argv[])
{
        u16 i = 1;

   
   while(i--)
   {         
          printf("pStr===>%d \n",strlen( (pStr+2)->str ) );
          printf("pStr===>%s \n",(pStr+2)->str);            
   }
   
        return 0;
}

出0入0汤圆

发表于 2014-11-29 18:51:15 来自手机 | 显示全部楼层
怎么发到这儿来了?

出0入0汤圆

发表于 2014-11-29 18:51:15 来自手机 | 显示全部楼层
怎么发到这儿来了?

出0入0汤圆

发表于 2014-11-29 21:19:31 | 显示全部楼层
指针有优点,也有缺点,关键看怎么用

出0入0汤圆

发表于 2014-11-29 21:42:19 | 显示全部楼层
笑了,这个真的是纯属月经贴;

出0入0汤圆

发表于 2014-11-29 21:55:12 | 显示全部楼层
感觉这个不应该算缺点,其他不用这样的动态语言也各有利弊

出0入0汤圆

发表于 2014-11-29 22:28:46 | 显示全部楼层
LZ ,是游戏就要有规则!

出0入0汤圆

发表于 2014-11-29 22:30:15 | 显示全部楼层
C的定义就是这样的,这根分配内存有关!

出0入0汤圆

发表于 2014-11-30 08:23:20 来自手机 | 显示全部楼层
wind2100 发表于 2014-11-29 13:41
原来大家都喜欢 傻瓜式编程!  

越界的事:我觉得可以在编译器上面动手脚,编译的时候知道,数组 ...

只检测数组的话问题不大,但由于指针的存在,当使用指针操作数组时就傻了,这种情况要检测越界开销就太大了。
说到底,C语言就是高级点的汇编,最后会生成什么样的指令是可以做到心里有数的,它不会给你添加额外的信息,给你充分的自由,就像双刃剑吧,威力无穷,耍不好会伤着自己。

出0入8汤圆

发表于 2014-11-30 08:42:26 | 显示全部楼层
高手们说说如何掌握C指针,有书推荐吗

出0入0汤圆

发表于 2014-11-30 10:12:30 | 显示全部楼层
大家来说说机器码的缺点……
其实C语言这种神通的语言,缺点都是可以克服的,克服不了的,只能说水平太次。

出0入0汤圆

发表于 2014-11-30 10:16:00 | 显示全部楼层
没有注释基本看不出你想干什么!

出0入8汤圆

发表于 2014-11-30 16:05:55 | 显示全部楼层
百里屠苏 发表于 2014-11-30 08:42
高手们说说如何掌握C指针,有书推荐吗

手不够高,但也蛮推荐下:
国内:
高质量C++/C编程指南 -- 林锐。
C语言深度解剖。

国外:
c陷阱与缺陷。
C专家编程。

出0入0汤圆

发表于 2014-11-30 16:45:00 | 显示全部楼层
cddx 发表于 2014-11-29 16:54
不要忘了当初发明C语音是为了替代汇编语言写操作系统软件的,所以有些所谓的“缺点”并不是真正的缺点哦, ...

十分同意,看看linux系统就是用c写的

出0入8汤圆

发表于 2014-11-30 17:03:24 | 显示全部楼层
security 发表于 2014-11-30 16:05
手不够高,但也蛮推荐下:
国内:
高质量C++/C编程指南 -- 林锐。

多谢,看看当当上有没有先

出0入0汤圆

发表于 2014-11-30 17:05:54 来自手机 | 显示全部楼层
C plus不错,这门语言不是刚出来的,存在了几十年,自然有其道理!指针是精华,用不好是自己的事了。

出0入0汤圆

发表于 2014-11-30 17:15:36 | 显示全部楼层
security 发表于 2014-11-30 16:05
手不够高,但也蛮推荐下:
国内:
高质量C++/C编程指南 -- 林锐。

我想看看C++的资料,谢谢推荐。话说当初看曾怡的C语言学的c。记得好像她说过还有指向指针的指针呢?

出0入0汤圆

发表于 2014-11-30 18:33:29 | 显示全部楼层
c语言这么博大,应该不是咱们能讨论的吧

出0入0汤圆

发表于 2014-11-30 20:17:48 | 显示全部楼层
专注XXOO三十年 发表于 2014-11-30 10:12
大家来说说机器码的缺点……
其实C语言这种神通的语言,缺点都是可以克服的,克服不了的,只能说水平太次。 ...

+1
C语言太灵活了,用的不好,只能说明你不行

出0入0汤圆

发表于 2014-11-30 20:21:10 | 显示全部楼层
我爱大秦 发表于 2014-11-30 17:05
C plus不错,这门语言不是刚出来的,存在了几十年,自然有其道理!指针是精华,用不好是自己的事了。 ...

+1
存在即理由,好东西能经得起时间的考验
C语言在TIOBE上排名一直都很稳定。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-11-30 20:25:41 | 显示全部楼层
bruce_helen 发表于 2014-11-30 20:21
+1
存在即理由,好东西能经得起时间的考验
C语言在TIOBE上排名一直都很稳定。

兄台这有图有真相呀!

出0入0汤圆

发表于 2014-11-30 20:28:49 | 显示全部楼层
建议楼主好好看看C语言缺陷。。。。。那本书!你说C问题多,但是VxWorks就是C语言的!

出0入0汤圆

发表于 2014-11-30 21:53:53 | 显示全部楼层
C语言的一些比如时序问题,内存分配问题可以用其他办法拟补,总体来说还是很经典的语言,需要学习的很多。

出0入0汤圆

 楼主| 发表于 2014-12-1 08:41:07 | 显示全部楼层
在wicy001 的引导下,已经有了第二种办法,定义字符串 不用再定义长度了,

如果再定义数组,还没试过,用什么办法,留下给你们自己想了。

他们后来的人根本不知道,我们想达到一个什么样的目的:
就是为了解决不定义数据长度,而通过指针去知道这个数据的长度。(字符串已经搞定) 见
42楼的例子。

出0入0汤圆

发表于 2014-12-1 08:45:18 | 显示全部楼层
仍然认为是最好的嵌入开发语言

出0入0汤圆

发表于 2014-12-1 09:10:23 | 显示全部楼层
c语言的小问题有,不过依然是目前最通用,生命力最强的语言,没有之一

出0入4汤圆

发表于 2014-12-1 13:36:30 | 显示全部楼层
你说的这个问题是你使用方法的缺陷,与C语言本身无关

出0入0汤圆

发表于 2014-12-1 15:05:15 | 显示全部楼层
彼岸花开@ 发表于 2014-11-29 10:15
1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计 ...

数组的最后不是“\0”,字符串才是。

出0入0汤圆

发表于 2014-12-1 15:16:26 | 显示全部楼层
yangwc 发表于 2014-12-1 15:05
数组的最后不是“\0”,字符串才是。

1.谢谢指点
2 之前有点蒙了,也是没有对数组和字符串有一个更加明确的认识

出0入0汤圆

发表于 2014-12-1 15:34:54 | 显示全部楼层
leebilly007 发表于 2014-12-1 13:36
你说的这个问题是你使用方法的缺陷,与C语言本身无关

说的对。

出0入0汤圆

发表于 2014-12-1 18:26:19 | 显示全部楼层
C语言还是最实在的语言嘛

出0入0汤圆

发表于 2014-12-1 19:43:21 | 显示全部楼层
C还是一个很好的工具。能够同时连接底层和应用层。如果更高级语言,比较容易产生冗余,对硬件要求高

出0入0汤圆

发表于 2014-12-1 20:47:36 | 显示全部楼层
C语言还是不错的,有些特殊用途的话需要用函数来解决了

出0入0汤圆

发表于 2014-12-1 21:48:32 | 显示全部楼层
封装特性差,第一反应

出0入0汤圆

发表于 2014-12-2 12:27:46 | 显示全部楼层
C语言怎么会有缺陷,只有编译器会有缺陷,或者设计思路有问题

出0入0汤圆

发表于 2014-12-2 12:43:14 | 显示全部楼层
C的缺陷倒是没有,因为英文缺陷叫bug,bug是编译器或者编程者造成的,编程语言语法之类没有缺陷
如果觉得c不好使,可以换C#,Java之类的语言,类库丰富,功能简洁
如果搞嵌入式觉得C不好用,建议试试汇编,然后你就会觉得C很好很强大了

出0入0汤圆

发表于 2014-12-2 13:08:19 | 显示全部楼层
指针操作不好就有问题。。。

出0入0汤圆

发表于 2014-12-2 13:11:40 | 显示全部楼层
可是我只会C啊。。。

出0入0汤圆

发表于 2014-12-2 13:15:12 | 显示全部楼层
字符串截止符为\0,可以判断这个为结束标志 pData== NULL 就可以了

出0入0汤圆

 楼主| 发表于 2014-12-2 13:25:30 | 显示全部楼层
子鱼 发表于 2014-12-2 13:15
字符串截止符为\0,可以判断这个为结束标志 pData== NULL 就可以了

是的,还好 我的例子是字符串,如果是数组, 就无能为力了。
所以,如果是数组还是得加结束符 标志 或是定义字节数。

出0入0汤圆

发表于 2014-12-2 15:11:46 | 显示全部楼层
wicy001对strlen和sizef说的很清楚,指针还是使用者方法差异导致结果不同。个人之见,C的精华在于指针,劣势也在于指针,具体好坏看人怎么用。

出0入0汤圆

发表于 2014-12-2 15:12:27 | 显示全部楼层
zhangchaoying 发表于 2014-11-29 11:17
指针,C语言的利器。学好不容易。

是的,深有同感

出140入115汤圆

发表于 2014-12-2 15:29:48 | 显示全部楼层
怎么发到这儿来了?

出0入0汤圆

发表于 2014-12-2 19:37:50 | 显示全部楼层
你可以定义数组类的链表嘛,我觉着用着很好用的,C语言结构清晰,是难得的学习编程的工具,其他语言总的来说语句倒是很多,就是难得背呢

出0入0汤圆

发表于 2014-12-2 19:57:52 | 显示全部楼层
wicy001对strlen和sizeof介绍的很详细,尤其是给出的例子很好 可以参考一下

出0入0汤圆

发表于 2014-12-2 22:17:36 | 显示全部楼层
strlen不是能知道数组里面“内容”的大小啊~ strlen是判断\0的。

sizeof可以判断 类型的大小啊~

出0入0汤圆

发表于 2014-12-2 22:18:33 | 显示全部楼层
这个不应该是缺陷吧~

是没有使用好吧~

出0入0汤圆

 楼主| 发表于 2014-12-2 23:16:43 | 显示全部楼层
songjie 发表于 2014-12-2 22:18
这个不应该是缺陷吧~

是没有使用好吧~

你说对了,是c没这功能了,要定义数据数,不然你要怎样用好?图片这些都有大小的,你改错,就飞出去了,不信你试试

出0入0汤圆

发表于 2014-12-18 14:14:39 | 显示全部楼层
这也算缺点?楼主以前用什么开发语言

出0入0汤圆

 楼主| 发表于 2014-12-18 15:31:49 | 显示全部楼层
superrf 发表于 2014-12-18 14:14
这也算缺点?楼主以前用什么开发语言

不要拿刀锋对着自己砍就好了。。。

出0入0汤圆

发表于 2014-12-18 15:49:24 | 显示全部楼层
不同的语言有不同的优缺点,用好就行
在嵌入式领域C语言优势明显
C语言的历史和市场占有率说明了一切。

出10入4汤圆

发表于 2014-12-18 17:07:41 | 显示全部楼层
楼主萌萌的,问题萌萌的!!

出0入0汤圆

发表于 2014-12-19 08:46:31 | 显示全部楼层
指针在汇编下看的话,就是寄存器间接寻址或者更往里一层

出0入0汤圆

发表于 2014-12-19 08:47:14 | 显示全部楼层
花点时间看看汇编还有C标准与实现,就能更深入了解C的特点,

出0入0汤圆

发表于 2014-12-19 08:52:46 | 显示全部楼层
LZ应再开一帖,标题我都替LZ想好了:“大家说来说自己对C语言的偏见”

出0入0汤圆

发表于 2014-12-19 09:05:37 | 显示全部楼层
javabean 发表于 2014-12-2 12:43
C的缺陷倒是没有,因为英文缺陷叫bug,bug是编译器或者编程者造成的,编程语言语法之类没有缺陷
如果觉得c ...

其实搞过汇编,对理解C的指针是挺有帮助的

出0入0汤圆

 楼主| 发表于 2014-12-19 11:20:27 | 显示全部楼层
其实目的 只有一个,要更快速,更简单的编程,达到自己想要的目的。
所以才不断衍生出很多高级语言。 像C#  OBC C++ JAVA PASCAL等等

出0入0汤圆

发表于 2014-12-20 14:28:20 | 显示全部楼层
1米49 发表于 2014-11-29 10:31
指针,运用的好就是神器,非常好用,实用。但是运用不好 对整个系统来说 就是灾难。
任何东西都有利有弊, ...

能详细举个例子吗?  展示一下楼主说话和实际能力的功底如何!

出0入0汤圆

发表于 2014-12-20 14:30:02 | 显示全部楼层
不支持OO和运算符重载

出0入0汤圆

发表于 2014-12-20 17:04:23 | 显示全部楼层
都快把C语言给忘掉了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 06:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表