1.C语言编码需要保证变长数组的长度参数位于合法范围之内
例如以下代码:
void func(size_t s) { int vla[s]; /*...*/ } /*...*/ func(size); /*...*/
解决方案如下:
enum {MAX_ARRAY = 1024}; void func(size_t s) { if(s < MAX_ARRAY && s != 0) { int vla[s]; /*...*/ } else { //错误处理 } } /*...*/ func(size); /*...*/
2.需要保证复制的目标具有足够的存储空间
参考代码如下所示:
enum {WORKSPACE_SIZE = 256}; void func(const int src[], size_t len) { int dest[WORKSPACE_SIZE]; if(len > WORKSPACE_SIZE) { //错误处理 } memcpy(dest, src, sizeof(int) * len); /*...*/ }
3.不要把一个指向非数组对象的指针加上或减去一个整数
错误代码如下所示:
struct numbers { short num1; short num2; /*...*/ short num9; }; int sum_numbers(const struct numbers *numb) { int total = 0; const int *numb_ptr; for(numb_ptr = &numb->num1; numb_ptr <= &numb->num9; numb_ptr++) { total += *(numb_ptr); } return total; } int main(void) { struct numbers my_numbers = {1,2,3,4,5,6,7,8,9}; sum_numbers(&my_numbers); return 0; }
上面的代码试图用指针运算访问结构的元素,这是危险的,因为结构中的字段并不保证在内存中是连续的
解决方案(使用数组)如下:
struct numbers { short num1; short num2; /*...*/ short num9; }; int sum_numbers(const short *numb, size_t dim) { int total = 0; const int *numb_ptr; for(numb_ptr = numb; numb_ptr < numb + dim; numb_ptr++) { total += *(numb_ptr); } return total; } int main(void) { short my_numbers[9] = {1,2,3,4,5,6,7,8,9}; sum_numbers(my_numbers, sizeof(my_numbers) / sizeof(my_numbers[0])); return 0; }
本文向大家介绍C语言 指针与二维数组详解,包括了C语言 指针与二维数组详解的使用技巧和注意事项,需要的朋友参考一下 二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩
指针概述 指针的概念 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,例如int型占4个内存单元,char型占1个内存单元。为了正确地访问这些内存单元,必须为每个内存单元编上号,根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地
本文向大家介绍C语言 数组指针详解及示例代码,包括了C语言 数组指针详解及示例代码的使用技巧和注意事项,需要的朋友参考一下 数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以int arr[] = { 99, 15, 100, 888, 252 };为例,该数组在内存中的分布如下图所示
我们已经在内存中看到了int类型的存储方式,如果我们存储的是0x12,就会在内存中得到二进制的编码0001 0010。如果我们存储一个float类型的1.2,又在内存中又有怎样的存储方式呐?下面我们使用两种方法来读取存储在内存中的float变量。 用int类型的指针来读取同样大小的四个字节 测试代码如下 我们可以看到由于不同的指针类型赋值,依然有一个警告。 运行结果如下 这就是浮点数1.2在内存中
本文向大家介绍Swift与C语言指针结合使用实例,包括了Swift与C语言指针结合使用实例的使用技巧和注意事项,需要的朋友参考一下 Objective-C和C的API常常会需要用到指针。Swift中的数据类型都原生支持基于指针的Cocoa API,不仅如此,Swift会自动处理部分最常用的将指针作为参数传递的情况。这篇文章中,我们将着眼于在Swift中让C语言指针与变量、数组和字符串共同工作。 #
本文向大家介绍C语言中二级指针的实例详解,包括了C语言中二级指针的实例详解的使用技巧和注意事项,需要的朋友参考一下 C语言中二级指针的实例详解 用图说明 示例代码: 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!