大家说来说C语言的缺点
我就感觉这个特不方便。1.我发现,要定义一个数组或是字符串,最好要定义数组的大小,不然,如果后面要用指针来操作这个数组,没办法知道数组大小,整个程序就OVER。
1、siziof 不知道能不能满足需要
2、能力有限不能给出更多的答案。
彼岸花开@ 发表于 2014-11-29 09:37
1、siziof 不知道能不能满足需要
2、能力有限不能给出更多的答案。
sizeof 只能统计数组 大小
我觉得一但指针被初始化后,指针指向的东西就是有大小的了 楼主发错版块了吧,这里是飞思卡尔专区 LZ这个问题和C语言是否有缺陷无关。 个人觉得c语言时序要求不高的地方还是挺方便的 这个是指针的强大之处,要好好的用!! wind2100 发表于 2014-11-29 09:56
sizeof 只能统计数组 大小
我觉得一但指针被初始化后,指针指向的东西就是有大小的了 ...
1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计数组的大小。是这个数组中已经有被填充的大小吧。。因为数组是未定义大小的,所以数组的大小还是有可以一直增加的。 我的理解对不对呢
2、用指针操作数组,如果发生越界。确实很严重。。
3、用指针的时候能不能判断一下 ,数组的最后总是'\0' 结束嘛。。这个我没有尝试过。 彼岸花开@ 发表于 2014-11-29 10:15
1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计 ...
数组大小是定义是确定的,貌似不能一直增加。至于用指针去访问数组的越界问题,那是软件设计的问题,和数组、c语言无关。
指针正是C语言的强大之处,楼主说的这个不是C语言的不足之处,而在于使用指针的人
wind2100 发表于 2014-11-29 09:56
sizeof 只能统计数组 大小
我觉得一但指针被初始化后,指针指向的东西就是有大小的了 ...
在定义指针的时,指针指向的东西就有大小。
比如 char* p, sizeof(*p)也只能是一个char
如果你想sizeof(*p)返回一个数组的大小,那么可以自定义之中类型
typedef struct
{
char str;
}
Str_TypeDef;
这是定义Str_TypeDef * p,此时sizeof(*p),就是数组str[]的大小了。
wind2100 发表于 2014-11-29 09:56
sizeof 只能统计数组 大小
我觉得一但指针被初始化后,指针指向的东西就是有大小的了 ...
给你提供个伪代码:ArrayCount = sizeof(Array) / sizeof(Array); 彼岸花开@ 发表于 2014-11-29 10:15
1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计 ...
数组和字符串混了。
数组里面的数据可以任意,并不是\0结尾
字符串才是\0结尾。
如果想用数组放字符串“www”,数组至少要定义成4个字节,第四个字节用来放'\0' 指针,运用的好就是神器,非常好用,实用。但是运用不好 对整个系统来说 就是灾难。
任何东西都有利有弊,看怎么运用了。
wicy001 发表于 2014-11-29 10:30
数组和字符串混了。
数组里面的数据可以任意,并不是\0结尾
1、 谢谢指点。确实弄错了、
本帖最后由 wicy001 于 2014-11-29 10:44 编辑
彼岸花开@ 发表于 2014-11-29 10:34
1、 谢谢指点。确实弄错了、
刚才只注意第三条了。
你说的第一点,也不准确,
我们常说的定义数组,都是指静态数组, 数组定义了,其大小就不能变了。
有一个概念是动态数组,就是堆,是calloc或malloc来申请。 wicy001 发表于 2014-11-29 10:43
刚才只注意第三条了。
你说的第一点,也不准确,
我们常说的定义数组,都是指静态数组, 数组定义了,其 ...
1、 对于静态数组。 他的长度在定义数组后,就确实了。
使用静态数组。方法一:是定义数组时同时定义数组的长度,同时给这个数组赋初值。这种不太常用。方法二:定义数组的时候不定义数组的长度,但是给数组初值。
方法三:定义数组的同时。定义数组的长度,但不给数组赋初值。这三种方法都能编译通过。方法四:定义数组的同时。不定义数组的长度也不给数组赋初值。。keil5 编译失败。
方法四编译不通过。也说明了静态数组在定义后,数组长度就就确定了
2 、明白了动态数组是申请内存来了。我的第一点,将静态数组和动态数组搞混了
1米49 发表于 2014-11-29 10:31
指针,运用的好就是神器,非常好用,实用。但是运用不好 对整个系统来说 就是灾难。
任何东西都有利有弊, ...
指针,C语言的利器。学好不容易。 彼岸花开@ 发表于 2014-11-29 11:05
1、 对于静态数组。 他的长度在定义数组后,就确实了。
使用静态数组。方法一:是定义数组时同时定义 ...
勤奋好学,赞一个。{:biggrin:} zhangchaoying 发表于 2014-11-29 11:17
指针,C语言的利器。学好不容易。
我也是会使用一点,都是参考别人,然后拿来用,其实像回调函数什么乱七八糟的,看的时候理解了,过段时间不用又忘记了,哎。
指向函数的指针,一直都没怎么用好 没有数组越界检测,没有内存自动回收。。。。 有时都不敢用指针 wicy001 发表于 2014-11-29 10:24
在定义指针的时,指针指向的东西就有大小。
比如 char* p, sizeof(*p)也只能是一个char
typedef struct tStr
{
char strA;
char strB;
}
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只是数组大小,并不是字符字节数。
按你的做法, 也不能统计到字节数,和定义数组大小一样。 先指定的大小。
其实我是想,能不能不定义数据的字节数,
实现,
char strA[]={"A2345"};
char strB[]={"B23456789A"};
char strC[]={"B23456789A123"};
超过8个字符,我要做一个左移,不超过的,不用左移 害得我,这样做了。
//=========================================================================================
typedef struct tStr
{
u8 Size;
const u8 * pStr;
}Str_Type;
const u8 StrGoodBye[] ={"Good Bye"};
const Str_Type Str[]={
{sizeof(StrGoodBye),StrGoodBye},
}; debian 发表于 2014-11-29 12:04
缺点是 不能面向对象
可以的哟,只要你能抽像出来。
C++ 也是架在C基础上的呀! wind2100 发表于 2014-11-29 13:19
typedef struct tStr
{
char strA;
数组的大小,和数组里存的数据个数,是两个不同的概念。
这种方法,只是针对你LZ位,说明用指针可以返回数组大小而已。 平时取数组大小,都是用12楼的方法。
现在才知道,你原来想取字符串的长度, 请用strlen()函数,用之前包含头文件<string.h>。 wind2100 发表于 2014-11-29 13:25
害得我,这样做了。
//=============================================================================== ...
百度 strlen 可以满足你。
你这基本功不扎实呀。 彼岸花开@ 发表于 2014-11-29 10:15
1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计 ...
完全错误, C语言不存在因为没定义大小就可以 随意增加数组大小的可能...
C89中不允许不指定数组大小的同时不给初始数据
C99允许, 但定义出的是0字节数组
另, C89数组只能静态定义大小, C99局部数组可以动态定义大小
但都不存在定义后直接增加的可能性...你这么做就是数组越界 世界上面没有什么东西是完美的.c语言也不例外, 指针和数组应该看用在什么地方 才能进行评价 chengz 发表于 2014-11-29 11:53
没有数组越界检测,没有内存自动回收。。。。
原来大家都喜欢 傻瓜式编程! {:lol:}
越界的事:我觉得可以在编译器上面动手脚,编译的时候知道,数组大小,data,0-99 data如果x > 99就跳过这一条指令。
函数退出来,你申请的动态内存就 释放了 ,但在PC上,free ,delete 选自百度, 把这几个例子弄懂了,应该可以满足你的要求
char* ss = "0123456789";
sizeof( ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符
大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
这就是sizeof(x)可以用来定义数组维数的原因
char str="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 = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数,内部实现是用一个循环计算到\0之前为止
int ss = "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 做了13年电子,写了13年C代码,感觉挺累的。 wicy001 发表于 2014-11-29 13:35
数组的大小,和数组里存的数据个数,是两个不同的概念。
这种方法,只是针对你LZ位,说明用指针可以返回 ...
一下忘记了,晕了。。。 多谢指点,这下子,多了一种办法了。 snoopyzz 发表于 2014-11-29 13:38
完全错误, C语言不存在因为没定义大小就可以 随意增加数组大小的可能...
C89中不允许不指定数组大小的同 ...
1、谢谢指出错误。。给出了C89 C99 的不得同。
2、在17 楼已经重新写了体会。如下:
1、 对于静态数组。 他的长度在定义数组后,就确实了。
使用静态数组。方法一:是定义数组时同时定义数组的长度,同时给这个数组赋初值。这种不太常用。方法二:定义数组的时候不定义数组的长度,但是给数组初值。
方法三:定义数组的同时。定义数组的长度,但不给数组赋初值。这三种方法都能编译通过。方法四:定义数组的同时。不定义数组的长度也不给数组赋初值。。keil5 编译失败。
方法四编译不通过。也说明了静态数组在定义后,数组长度就就确定了
2 、明白了动态数组是申请内存来了。我的第一点,将静态数组和动态数组搞混了 sizeof 不是函数,相当于宏,编译时展开。
其针对类型求解。如果 a 是数组,sizeof(a) 就是数组长度, 如果 a 是指针,那就是指针这个类型的长度。 彼岸花开@ 发表于 2014-11-29 14:28
1、谢谢指出错误。。给出了C89 C99 的不得同。
2、在17 楼已经重新写了体会。如下:
1、 对于静态数 ...
在MDK里人工加上-c99就应该可以定义没长度的数组也不给初值了...但此时数组长度是0
加了-c99也可以用动态数组,C99中的名字叫变长数组, 适用于局部数组变量, 其长度可以用一个变量来指定
另外用malloc 申请内存(分配在堆上), 也可以变向当数组来用, 但记得要free掉,
变长数组分配在栈上, 作用域一结束栈就自动还原了所以不用人工释放 snoopyzz 发表于 2014-11-29 13:38
完全错误, C语言不存在因为没定义大小就可以 随意增加数组大小的可能...
C89中不允许不指定数组大小的同 ...
局部数组动态大小。
学到了,我想应该是通过在栈上 SP-X, X 可变实现的。 本帖最后由 cddx 于 2014-11-29 17:43 编辑
不要忘了当初发明C语音是为了替代汇编语言写操作系统软件的,所以有些所谓的“缺点”并不是真正的缺点哦,她有一个重要假定就是编程员自己知道要干什么,只是后来C发展的太好了,以至于大家把它用在了几乎所有领域,还繁衍出一个庞大类C家族,C++、C#、java、python、objective-c、lua等。
OK 现在发现另一种办法了,辛苦了各位,希望大家都学到
#include <stdio.h>
#include <string.h>
#include “std.h”
typedef struct tStr
{
char str;
}
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;
} 怎么发到这儿来了? 怎么发到这儿来了? 指针有优点,也有缺点,关键看怎么用 笑了,这个真的是纯属月经贴; 感觉这个不应该算缺点,其他不用这样的动态语言也各有利弊 LZ ,是游戏就要有规则! C的定义就是这样的,这根分配内存有关! wind2100 发表于 2014-11-29 13:41
原来大家都喜欢 傻瓜式编程!
越界的事:我觉得可以在编译器上面动手脚,编译的时候知道,数组 ...
只检测数组的话问题不大,但由于指针的存在,当使用指针操作数组时就傻了,这种情况要检测越界开销就太大了。
说到底,C语言就是高级点的汇编,最后会生成什么样的指令是可以做到心里有数的,它不会给你添加额外的信息,给你充分的自由,就像双刃剑吧,威力无穷,耍不好会伤着自己。 高手们说说如何掌握C指针,有书推荐吗 大家来说说机器码的缺点……
其实C语言这种神通的语言,缺点都是可以克服的,克服不了的,只能说水平太次。 没有注释基本看不出你想干什么! 百里屠苏 发表于 2014-11-30 08:42
高手们说说如何掌握C指针,有书推荐吗
手不够高,但也蛮推荐下:
国内:
高质量C++/C编程指南 -- 林锐。
C语言深度解剖。
国外:
c陷阱与缺陷。
C专家编程。
cddx 发表于 2014-11-29 16:54
不要忘了当初发明C语音是为了替代汇编语言写操作系统软件的,所以有些所谓的“缺点”并不是真正的缺点哦, ...
十分同意,看看linux系统就是用c写的 security 发表于 2014-11-30 16:05
手不够高,但也蛮推荐下:
国内:
高质量C++/C编程指南 -- 林锐。
多谢,看看当当上有没有先 C plus不错,这门语言不是刚出来的,存在了几十年,自然有其道理!指针是精华,用不好是自己的事了。 security 发表于 2014-11-30 16:05
手不够高,但也蛮推荐下:
国内:
高质量C++/C编程指南 -- 林锐。
我想看看C++的资料,谢谢推荐。话说当初看曾怡的C语言学的c。记得好像她说过还有指向指针的指针呢? c语言这么博大,应该不是咱们能讨论的吧 专注XXOO三十年 发表于 2014-11-30 10:12
大家来说说机器码的缺点……
其实C语言这种神通的语言,缺点都是可以克服的,克服不了的,只能说水平太次。 ...
+1
C语言太灵活了,用的不好,只能说明你不行 我爱大秦 发表于 2014-11-30 17:05
C plus不错,这门语言不是刚出来的,存在了几十年,自然有其道理!指针是精华,用不好是自己的事了。 ...
+1
存在即理由,好东西能经得起时间的考验
C语言在TIOBE上排名一直都很稳定。
bruce_helen 发表于 2014-11-30 20:21
+1
存在即理由,好东西能经得起时间的考验
C语言在TIOBE上排名一直都很稳定。
兄台这有图有真相呀! 建议楼主好好看看C语言缺陷。。。。。那本书!你说C问题多,但是VxWorks就是C语言的! C语言的一些比如时序问题,内存分配问题可以用其他办法拟补,总体来说还是很经典的语言,需要学习的很多。 在wicy001 的引导下,已经有了第二种办法,定义字符串 不用再定义长度了,
如果再定义数组,还没试过,用什么办法,留下给你们自己想了。
他们后来的人根本不知道,我们想达到一个什么样的目的:
就是为了解决不定义数据长度,而通过指针去知道这个数据的长度。(字符串已经搞定) 见
42楼的例子。 仍然认为是最好的嵌入开发语言 c语言的小问题有,不过依然是目前最通用,生命力最强的语言,没有之一 你说的这个问题是你使用方法的缺陷,与C语言本身无关 彼岸花开@ 发表于 2014-11-29 10:15
1、如果在初始化的时候,没有定义数组的大小。在后边使用的时候数组的中被赋值。。。那么使用sizeof 统计 ...
数组的最后不是“\0”,字符串才是。 yangwc 发表于 2014-12-1 15:05
数组的最后不是“\0”,字符串才是。
1.谢谢指点
2 之前有点蒙了,也是没有对数组和字符串有一个更加明确的认识
leebilly007 发表于 2014-12-1 13:36
你说的这个问题是你使用方法的缺陷,与C语言本身无关
说的对。 C语言还是最实在的语言嘛 C还是一个很好的工具。能够同时连接底层和应用层。如果更高级语言,比较容易产生冗余,对硬件要求高 C语言还是不错的,有些特殊用途的话需要用函数来解决了 封装特性差,第一反应 C语言怎么会有缺陷,只有编译器会有缺陷,或者设计思路有问题 C的缺陷倒是没有,因为英文缺陷叫bug,bug是编译器或者编程者造成的,编程语言语法之类没有缺陷
如果觉得c不好使,可以换C#,Java之类的语言,类库丰富,功能简洁
如果搞嵌入式觉得C不好用,建议试试汇编,然后你就会觉得C很好很强大了{:titter:} 指针操作不好就有问题。。。 可是我只会C啊。。。 字符串截止符为\0,可以判断这个为结束标志 pData== NULL 就可以了 子鱼 发表于 2014-12-2 13:15
字符串截止符为\0,可以判断这个为结束标志 pData== NULL 就可以了
是的,还好 我的例子是字符串,如果是数组, 就无能为力了。
所以,如果是数组还是得加结束符 标志 或是定义字节数。 wicy001对strlen和sizef说的很清楚,指针还是使用者方法差异导致结果不同。个人之见,C的精华在于指针,劣势也在于指针,具体好坏看人怎么用。 zhangchaoying 发表于 2014-11-29 11:17
指针,C语言的利器。学好不容易。
是的,深有同感 怎么发到这儿来了? 你可以定义数组类的链表嘛,我觉着用着很好用的,C语言结构清晰,是难得的学习编程的工具,其他语言总的来说语句倒是很多,就是难得背呢 wicy001对strlen和sizeof介绍的很详细,尤其是给出的例子很好 可以参考一下 strlen不是能知道数组里面“内容”的大小啊~ strlen是判断\0的。
sizeof可以判断 类型的大小啊~ 这个不应该是缺陷吧~
是没有使用好吧~ songjie 发表于 2014-12-2 22:18
这个不应该是缺陷吧~
是没有使用好吧~
你说对了,是c没这功能了,要定义数据数,不然你要怎样用好?图片这些都有大小的,你改错,就飞出去了,不信你试试 这也算缺点?楼主以前用什么开发语言 superrf 发表于 2014-12-18 14:14
这也算缺点?楼主以前用什么开发语言
不要拿刀锋对着自己砍就好了。。。 不同的语言有不同的优缺点,用好就行
在嵌入式领域C语言优势明显
C语言的历史和市场占有率说明了一切。 楼主萌萌的,问题萌萌的!! 指针在汇编下看的话,就是寄存器间接寻址或者更往里一层 花点时间看看汇编还有C标准与实现,就能更深入了解C的特点, LZ应再开一帖,标题我都替LZ想好了:“大家说来说自己对C语言的偏见” javabean 发表于 2014-12-2 12:43
C的缺陷倒是没有,因为英文缺陷叫bug,bug是编译器或者编程者造成的,编程语言语法之类没有缺陷
如果觉得c ...
其实搞过汇编,对理解C的指针是挺有帮助的 其实目的 只有一个,要更快速,更简单的编程,达到自己想要的目的。
所以才不断衍生出很多高级语言。 像C#OBC C++ JAVA PASCAL等等 1米49 发表于 2014-11-29 10:31
指针,运用的好就是神器,非常好用,实用。但是运用不好 对整个系统来说 就是灾难。
任何东西都有利有弊, ...
能详细举个例子吗?展示一下楼主说话和实际能力的功底如何! 不支持OO和运算符重载 都快把C语言给忘掉了
页:
[1]
2