当前位置: 首页 > 知识库问答 >
问题:

C编程Malloc做得不对[duplicate]

毛胜
2023-03-14

创建动态数组时:

int *arr = (int *) malloc( 4 * sizeof(int) );

所以它应该包含4个整数(对于空间问题,可能需要2到3个),但是为什么这样做呢:

    for ( int x = 0; x < 30000; x++) {
         arr[x] = x;
     }

我的意思是不应该有这么多的空间来容纳30000个变量,而且它工作得很好,这是什么原因呢?它和c std::vector一样吗?或者我如何理解它?

如果我把循环范围设为50000,它会崩溃,但它甚至应该像索引a[100]或之前那样崩溃,因为数组是4个元素大的。

如果这很重要的话,我正在使用gnu/linux。

我努力去理解它。

请帮忙

共有2个答案

应和悦
2023-03-14

C不承担阵列限制的责任。如果希望确保不会超出分配的空间,则需要创建一个表示分配空间大小的变量,并在malloc命令和for循环中使用它。

你对C的理解需要提高,这样你才能理解使用低级语言有它的局限性和责任。

C对字符数组进行伪内存检查,通过在每个“字符串”的末尾加一个null(0)来完成,但这只适用于某些方法和技术。

韩嘉祯
2023-03-14

正如上面的评论所提到的,C不是一种“绑定检查”语言(如果这是您所需要的,那么有很多选择,从D到Nim,也可以很容易地与纯ANSI C混合)。

现在,回到你的问题。

你所做的是为4 int分配一些内存。到目前为止还不错。

您可以访问内存的其他部分(或比最初分配的内存更多的内存,请参阅:超出范围)并侥幸逃脱,这并不意味着您应该这么做。它可能会崩溃,也可能不会。这就是所谓的“未定义行为”。

现在,如果你想安全起见,就按你应该的方式去做:

  1. 先分配你需要的内存
  2. 访问它-始终在范围内
  3. 用完了就放了它
 类似资料:
  • null 这是正确的理解吗?如果是这样,那么在使用指针与malloc()连接时,是否总是使用数组算术是明智的? 谢谢你,亚历克斯

  • 今天,我读到了《C编程语言》(第二版Brian W.Kernighan&Dennis M.Ritchie)第167页,发现作者说我必须强制转换。以下是书中的部分: 7.8.5存储管理 函数malloc和calloc动态地获取内存块。

  • malloc(配置内存空间) 相关函数 calloc,free,realloc,brk 表头文件 #include<stdlib.h> 定义函数 void * malloc(size_t size); 函数说明 malloc()用来配置内存空间,其大小由指定的size决定。 返回值 若配置成功则返回一指针,失败则返回NULL。 范例 void p = malloc(1024); /*配置1k的内存

  • malloc 配置内存空间 相关函数 calloc,free,realloc,brk 表头文件 #include<stdlib.h> 定义函数 void *malloc(size_t size); 函数说明 malloc()用来配置内存空间,其大小由指定的size决定。 返回值 若配置成功则返回一指针,失败则返回NULL。 范例 void p = malloc(1024); /*配置1k的内存

  • 什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。 CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下: 公共网关接口(CGI),是一种用于外部网关程序与信息服务器(如 HTTP 服务器)对接的接口标准。 目前的版本是 CGI/1.1,CGI/1.2 版本正在推进中。 Web 浏览 为了更好地了解 CGI 的概念,

  • 主要的困惑是:第一个代码不管它的错误,仍然可以修改数组元素,而第二个代码,不能修改数组元素;因为两个函数都传递数组的地址;我们通过地址来操作数组元素