首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能直接在C中为指针分配数组?

在C语言中,指针和数组是两个不同的概念,虽然它们在某些方面有相似之处,但在内存分配和使用上有着明显的区别。

首先,让我们来了解一下指针和数组的基本概念:

  • 指针是一个变量,它存储了一个内存地址,该地址指向另一个变量的存储位置。通过指针,我们可以访问和修改指向的变量的值。
  • 数组是一组相同类型的元素的集合,这些元素在内存中是连续存储的。数组可以通过索引访问和修改其中的元素。

在C语言中,我们可以使用指针来动态分配内存,以便在运行时创建数组。这种方式称为动态内存分配,使用malloc()函数来分配内存。例如,我们可以使用以下代码来动态分配一个整型数组:

代码语言:c
复制
int* ptr;
int size = 5;
ptr = (int*)malloc(size * sizeof(int));

上述代码中,我们声明了一个指向整型的指针ptr,然后使用malloc()函数分配了一个包含5个整型元素的数组。sizeof(int)用于确定每个整型元素的大小,以便正确分配内存空间。

然而,直接在C中为指针分配数组是不可行的,因为指针和数组在内存中的存储方式不同。数组在编译时就会分配一块连续的内存空间,而指针只是存储了一个地址,并没有为其指向的数据分配内存空间。

如果我们尝试直接为指针分配数组,例如:

代码语言:c
复制
int* ptr;
int size = 5;
ptr = new int[size];

这样的代码是错误的,因为new关键字是C++中用于动态分配内存的语法,而不是C语言中的关键字。

总结起来,不能直接在C中为指针分配数组,因为指针和数组在内存分配和使用上有着明显的区别。如果需要动态分配数组,应该使用指针和malloc()函数来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ sizeof()运算符的参数指针数组的值为什么不同

sizeof()的参数指针数组 C++或C语言中,都可以使用sizeof()运算符来计算数组的字节大小,除此之外,在C++和C语言中,都可以使用一个指向数组第一个元素的内存地址的指针来引用数组,因此...,如果要计算数组的字节大小,或长度,传递数组本身或传递指向数组指针给sizeof()运算符似乎都是可以的,实际上则不然,二者有本质上的区别。...namespace std; int main(){ int arr[] = {1,2,3}; // 计算arr的大小 int n = sizeof(arr); // 定义一个指针指向数组...这是为什么呢? 不同值的原因 这主要是因为当sizeof()运算符的参数是数组本身,将计算的是数组的大小,而如果传递的是指针作为参数,那计算的便是指针的大小,而不是整个数组的。...来源:C++ sizeof()的参数指针数组的区别 免责声明:内容仅供参考,不保证正确性。

16121

C 语言】结构体 ( 结构体嵌套一级指针 | 分配内存时先 结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

文章目录 一、结构体嵌套一级指针 1、声明 结构体类型 2、 结构体 变量分配内存 ( 分配内存时先 结构体分配内存 然后再为指针分配内存 ) 3、释放结构体内存 ( 释放内存时先释放 指针成员内存...然后再释放结构头内存 ) 二、完整代码示例 一、结构体嵌套一级指针 ---- 1、声明 结构体类型 声明 结构体类型 : 这里注意 , 在结构体 , 定义一个 一级指针 变量 , 注意与 数组类型区别..., 向堆内存赋值 char *address; }Student; 2、 结构体 变量分配内存 ( 分配内存时先 结构体分配内存 然后再为指针分配内存 ) 结构体 变量分配内存 : 结构体...内存分配完成之后 , 需要立刻 结构体的 一级指针 成员分配内存 ; /** * @brief create_student 堆内存中分配内存 * @param array 二级指针 , 指向结构体数组...int i = 0; // 堆内存结构体指针分配内存 create_student(&array, 2); // 命令行 , 接收输入的年龄 for(i = 0

2.4K30
  • C 语言】结构体 ( 结构体嵌套二级指针 | 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

    文章目录 一、结构体嵌套二级指针 1、结构体嵌套二级指针 类型声明 2、 结构体内的二级指针成员 分配内存 3、释放 结构体内的二级指针成员 内存 二、完整代码示例 一、结构体嵌套二级指针 -...--- 1、结构体嵌套二级指针 类型声明 结构体 嵌套 二级指针 , 二级指针 可以使用 指针数组 / 二维数组 / 自定义二级指针内存 三种内存模型的任意一种 ; 此处选择的模型是 自定义二级指针内存...堆内存中分配内存 * 二级指针成员分配内存时 , 先为二级指针分配内存 , 再为一级指针分配内存 * @param array 二级指针 , 指向结构体数组 * @return */ int...* 二级指针成员分配内存时 , 先为二级指针分配内存 , 再为一级指针分配内存 * @param array 二级指针 , 指向结构体数组 * @return */ int create_student...int i = 0; // 堆内存结构体指针分配内存 create_student(&array, 2); // 命令行 , 接收输入的年龄 for(i = 0

    1.7K10

    关于CC++ 一些自己遇到的问题以及解惑

    那么为什么会产生这样的效果呢,揭秘如下. 若是内存递减分配,对于数组和i的内存分配如下: ? 若是内存递增分配,对于数组和i的内存分配如下: ?        ...,对于递减这种分配模式,iarray[3]的地址就是i的地址,iarray[3]=0便是i=0,这样一来便导致了i的值又重新被赋值0,导致了死循环,然后,注意,没有完,之所以i会跟在数组后面,是因为字节对齐...由于我们的main函数不被其他函数调用(注意:不是不可调用,是一般情况下不调用,如果你想挨骂的话…),所以就不能像其他函数一样,在程序运行获取参数数据,那为什么还要有这个参数呢,实际上,这个参数是程序运行时...查找了大量的有关博文,大多数有关博文都有怎么一张图,如果说以前,可能会同意,但是现在对图中栈区的向下增长有一些疑惑,就拿我们刚开始数组死循环的内存分配来说,内存两种分配模式,递增,递减,所以我觉得这个图还有待考证...,元素指针 int (*p)[];              数组(样式的)指针 本质是指针 上面出现的括号都是必要的,不可省略,说其是一种格式也不为过,指针XX和XX指针分不清主次,可以像我一样在两者之间加上

    67541

    C++:22 再议const的作用(上)

    C++:18篇里说过const的用法,这里有必要再提升进阶下const的理解。 因为你可能只知道他是怎么用的,但是他为什么这样用,其他用法呢? 首先回顾下const有什么主要的作用?...为什么呢? const可以用于集合,但编译器不能把一个集合存放在它的符号表里,所以必须分配内存。在这种情况下,const意味着“不能改变的一块存储”。...然而,其值在编译时不能被使用,因为编译器在编译时不需要知道存储的内容。自然,作为数组的大小就不行了。 在函数声明的形参,在函数被调用时会得到实参的值。但是如果在类呢?...,将类成员变为只读属性(只读:不能出现在“=”的左边,但在类仍可以用一个指针来修改其值。)...所以不可以直接在类的构造函数初始化const 的成员。

    86320

    详解指针(超详细)(第一卷)

    2.解引用(用于访问指针所指向的内存单元的值) 当我们用指针访问到a的地址后,就可以不用直接操作a进而改变a的值,可以直接在a的地址改变a的值(当然a的地址不变,只是地址存储的值发生了改变),通过这个方法我们可以进行一些...“非法”操作啦 比如我们将a定义成一个具有常属性的变量,就无法直接对a的值进行改变,这时我们就可以用解引用,例如这样 (c++不支持该操作,编译器会报错) 二.指针变量 1.注意上文对指针p的定义是...1.指针+整数 这两个算法都是用指针遍历数组然后打印,把数组第一个元素的地址存进指针,然后顺藤摸瓜找出数组剩余元素的地址。...使用智能指针:智能指针可以自动管理动态分配的内存,避免手动释放内存时出现错误。 3. 检查指针有效性:在使用指针之前,通过检查指针是否 NULL 或者是否指向有效的内存地址来确保指针的有效性。...使用范围检查:对于数组或动态分配的内存,使用范围检查来避免越界访问。 5. 避免指针运算错误:确保指针运算的正确性,避免指针指向错误的地址。 6.

    8310

    手把手教玩你转动态内存管理(InsCode Stable Diffusion 美图活动一期)

    一、动态内存管理的意义 在我们敲代码的时候,是否会有着这样的想法,为什么创建的这个数组arr[10]它就只能存储10个元素呢,它为什么不能在程序的运行时跟随我们的需要,扩大它对应的空间呢?...可能有的小伙伴不是很理解为什么会造成浪费,举个例子,有一个能存放100个整型的数组,但我只放了10个元素进去,但计算机它已经把这400个字节的空间分配给了这个数组,这400个字节的空间在这个数组销毁之前...有联想能力的小伙伴恐怕就想到了,那如果写了个循环一在开辟空间,且通过特殊的方式让程序无法结束,那是否会占用计算机的大量内存,是的,这可能会使计算机没法正常工作。...而realloc一看,后面还有50呢,随便开辟,没事,大方的很,那么此时就会直接在原有数据之后直接追加 情况2: 那么假设想把这100个字节的空间开辟成200个字节的怎么办呢,realloc一看...计算机没法给那么大的空间 ​ 三、柔性数组 顾名思义,柔性数组就是可以变换大小的数组,在c++上面数组可以传变量,而在c数组只能传常量,我们要怎么开辟柔性数组呢?

    13510

    总结---5

    C语言中将数组的下标改写成指针偏移量的主要原因在于指针和偏移量是底层硬件所使用的基本类型。...如a[i]的i总被 编译器解析偏移量,所以a[i]总是被改写成*(a+i)的形式,a是指向数组第一个元素的指针,加上偏移量i,表示该指针向后移i个步长,然后取 a+i所在单元的内容。...由此就可以解释为什么C语言中数组的下标可以为负,而且在我看来,C语言中不检查数组的下标是否越界同样跟这个有关,如下面这段程 序: #include int main(void)  ...sizeof(p),p 指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。...;k不要忘了考虑对齐问题,这里dda4个字节。

    871100

    C++ extern 数组指针

    在一次使用 extern 声明全局变量的过程,因为数组指针的混用引发了错误。 我们知道,C++ 中使用 extern 来声明在其他(未使用 include 包含的)文件的全局变量。..."; 在另一个 b.cpp 想使用这个全局变量,由于固有的思想,指针数组名通用,偷懒写成了如下形式: extern char *a; 由此引发了一个 `segmentation fault...因此查阅了一下相关资料,发现指针数组名是不能混用的。 ### 指针数组名的区别 > 数组名代表了存放该数组的那块内存,它是这块内存的首地址。...extern char * a; 这是一个外部变量的声明,它声明了一个名为 a 的字符指针,编译器看到这个声明就知道不必这个指针变量分配空间,这个 .cpp 文件中所有对指针 a 的引用都化为一个不包含类型的标号...这里问题就出现了:由于在这个文件声明的 a 是一个指针变量而不是数组,链接器的行为实际上是把指针 a 自身的地址定位到了另一个 .c 文件定义的数组首地址之上,而不是我们所希望的把数组的首地址赋予指针

    43100

    C语言】动态内存管理及相关笔试题

    一、为什么有动态内存分配    我们之前已经学过一些开辟内存的方法,就是创建变量时,操作系统给我们分配的空间,而内存大致分为以下3个大部分,如图:    我们创建局部变量或者是创建函数的形参时,...有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了    C语⾔引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间,就⽐较灵活了,而动态内存开辟的空间属于堆区,...,那么realloc就会直接在ptr的尾巴后面继续开辟空间,保持ptr空间的内容不变然后返回的也是ptr 但是还有另一种情况,就是我们需要增容的空间比未分配的空间大,那么它就会找另一个可以把原空间和增容空间一起放下的地方...的返回值时,可以创建一个临时指针,然后判断它是否空,不为空再把这个临时指针赋值给我们的ptr    我们还是以指针模拟数组那个例子来讲,现在我们觉得5个整型空间不够了,要再增容5个整型空间的方法如下...,我们将C/C++中程序内存区域划分拿来总结一下C/C++程序内存分配的⼏个区域: 栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时这些存储单元⾃动被释放。

    8610

    【答疑解惑】常量字符串引发的“血案”

    上图与下面这个图中,请注意main函数s1和s2这两个变量。一个定义指针,一个定义数组。他的问题是:为什么下图中用数组定义的能正常运行,但是上图中用指针定义的取运行出错!...看起来差不多的程序,但是第一个能正常运行,第二个却不能运行,为什么呢?...要正确理解这个问题,需要了解C语言中变量及常量的存储位置,这个其实在咱们程序员互动联盟里面以前的文章应该也讲到过,一阅读和关心的朋友应该看到过。...但是关键点来了,s1和s2是数组,他们的内存空间也是分配在栈的,由于这两个变量在分配时同时需要用常量初始化的,所以在变量空间在栈中分配好后,编译器会做额外的工作,它会自动把那个只读的字符串拷贝过来初始化这个栈的变量...对于初学者,只要知道C语言中字符常量编译在只读区,不能写即可。

    73270

    CC++练习题(三)

    而 GNU 一都紧跟规范,所以在最新的 linux 版本自带的 gcc 和 g++都支持变长数组了。...在 C语言中产生死循环只有一个原因,就是循环条件一真。在本题中也就是 i<=5 将一成立。可问题是,循环变量 i 在每次循环结束后都做了 i++。理论上,不可能产生死循环。...线程可以更改从属的进程 程序并不能单独运行,只有将程序装载到内存,系统分配资源才能运行,而这种执行的程序就称之为进程。...strcpy是最初C的字符串处理函数,只能用于以0结束的字符串,甚至不能用于字符数组的处理,因为strcpy不带长度信息因此是不安全的函数,很多黑客都是从这个函数入手做很多事。...按照刚才分析 显然 A D就错了 D错的原因是 线程执行需要资源 因此必然属于一个进程而不能更改 B这个最容易搞错,线程被创建后必须有自己的栈空间而不能共享。

    2.2K40

    栈区和堆区内存分配区别

    以来总是对这个问题的认识比较朦胧,相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在运维 一以来总是对这个问题的认识比较朦胧...,相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?...,这个时候,大家已经清楚了,p现在存放的是在堆申请的字符数组的首地址,也就是在堆申请的数组的地址现在被赋给了在栈上申请的指针变量p.为了更加形象的说明问题,请看下图: 从上图可以看出,我们在堆上动态分配数组的首地址存入了指针...上面给大家陈述了它们之间的概念,对于它们俩的使用比较方面,这里不能大家断续陈述了,对于这个问题,网上一网友的文章阐述的比较详细,而且附带了专业的色彩,下面的文章是部分片断....在栈上的数组指针所指向的字符串(例如堆)快。

    1.2K30

    UE4的智能指针 TSharedPtr

    在UE4有很多种智能指针,除了类似于C++的shared_ptr,unique_ptr等智能指针对应实现外,也有很多种和UObject相关的智能指针实现。...这里列出知道的,不保证是UE4所有的,可能有遗漏,但大部分都是很常用的 1 持有非UObject对象的智能指针 TSharedPtr,TSharedRef,TWeakPtr,TSharedFromThis...当然因为这个类本质还是一个C++的类,这里还必须像指针一样使用->操作,不像引用在编译器下,把指针的->操作都换成了引用的.操作。可以说这个类是UE4特有的,STL并没有对应实现。...你可能会好奇,为什么要这么中转一遍,直接在构造函数里调用UpdateWeakReferenceInternal不就好了吗?...当然还有其他几个辅助函数,类型转换和清理数组,其中类型转换对应于STL的std::static_pointer_cast和std::const_pointer_cast,不过STL在C++17才有,这里

    2.5K20

    CC++刁钻问题各个击破之细说sizeof

    原因是在函数参数传递时,数组被转化成指针了,或许你要问为什么要转化成指针,原因可以在很多书上找到,简单说一下:假如直接传递整个数组的话,那么必然涉及到数组元素的拷贝(实参到形参的拷贝),当数组非常大时...而只传递数组的地址(即指针)那么只需要拷贝4byte。 特性4:sizeof不能求得动态分配的内存的大小!...通过特性3和特性4,我们看到了数组指针有着千丝万缕的关系,这些关系也是导致程序潜在错误的一大因素,关于指针数组的关系问题将在《C/C++刁钻问题各个击破之指针数组的秘密》一文中进行详细介绍。...特性3指出sizeof能求静态分配数组的大小,而特性4说明sizeof不能求的动态分配的内存的大小。...最开初c标准规定sizeof只能编译时求值,后来c99又补充规定sizeof可以运行时求值。但值得注意的是,即便是在实现了c99标准的DEV C++仍然不能用sizeof求得动态分配的内存的大小!

    88220

    面试总结-C++

    的static关键字的总结 几个复制的声明 void * ( * (*fp1)(int))[10]; //fp1是一个指针,指向一个函数,函数参数int,函数返回参数是一个指针指针指向一个数组,...见为什么不能建立引用数组 将引用作为函数的参数时,可以避免对变量或者对象的复制,因此不会调用对象的拷贝构造函数。当不希望传入的引用参数不被改变时,使用const引用。...函数不能返回局部变量的引用,不能返回函数内部ne分配的内存的引用。(虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。...- 数组名不是真正意义上的指针,可以理解指针,所以数组名没有自增、自减等操作。...(1)操作符new返回的指针类型严格与对象匹配,而不是void; (2)C很多以void参数的函数可以改写C++模板函数,而模板是支持类型检查的; (3)引入const关键字代替#define constants

    2.1K11

    CC++常见面试知识点总结附面试真题—-20220326更新

    大家好,又见面了,是你们的朋友全栈君。 第一部分:计算机基础 1. C/C++内存有哪几种类型?...用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一占据该内存单元即为内存泄露。 1). 使用的时候要记得指针的长度. 2). malloc的时候得确定在那里free. 3)....指针数组数组指针的区别 数组指针,是指向数组指针,而指针数组则是指该数组的元素均为指针数组指针,是指向数组指针,其本质指针,形式如下。...数组指针是指向数组首元素的地址的指针,其本质指针,可以看成是二级指针。...类型名 (*数组标识符)[数组长度] 指针数组,在C语言和C++数组元素全为指针数组称为指针数组,其中一维指针数组的定义形式如下。指针数组每一个元素均为指针,其本质数组

    1.5K10

    C语言:动态内存管理

    } 我们在使用指针变量p接受动态开辟的空间时,一定要记住不要随意地去修改p,这样一旦找不到这段空间,就不能及时的释放。上述代码,a是在栈区创建的,free就会出问题。...程序有一个while循环,所以程序一不结束,这样空间一不被释放,空间泄露会越来越严重!...九、柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 ,结构的最后⼀个元素允许是未知大小的数组,这就叫做『柔性数组』成员。...而且最后释放2次,1次是释放动态数组的空间,1次是释放结构体的空间。 动态数组同样可以完成这个功能,那为什么c99还要引入柔性数组呢?因为柔性数组有两个好处。...9.4.4 文章拓展 C语言结构体里的成员数组指针 | 酷 壳 - CoolShell 十、总结C/C++中程序内存区域划分 C/C++程序内存分配的⼏个区域: 1.

    13410

    C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案

    存放指针数组:char *array[5];含义是一个数组存放了5个指向字符型数据的指针。...按照题意,理解初始化一个存放指针数组,char *array[2]={“China”,”Beijing”};其含义是初始化了一个有两个指向字符型数据的指针数组,这两个指针分别指向字符串”China...不过,总是喜欢显式申明,使得代码更加清晰。 5、在C++ 程序调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?...按照题意,理解初始化一个存放指针数组,char *array[2]={“China”,”Beijing”};其含义是初始化了一个有两个指向字符型数据的指针数组,这两个指针分别指向字符串”China...2)有些编译器可以对const常量进行调试,不能对宏调试。 15、头文件的ifndef/define/endif干什么用? 正确答案: 防止重复定义 16、C++为什么用模板类。

    2.4K20

    c++的链表-C++链表

    C++链表   链表是由一系列连接在一起的结点构成,其中的每个结点都是一个数据结构。   ...如果需要从链表删除特定的信息块,则程序将删除包含该信息的结点。   为什么要用到链表   数组作为存放同类数据的集合,给我们程序带来了很多方便,增加了灵活性。但数组同样存在弊病。...如数组的大小在定义时要事先规定大小,不能在程序中进行调整。所以我们只能够根据可能的最大需求来定义数组,常常会造成一定的存储空间浪费。   ...链表的每一个结点的数据类型结构体类型。结点有两个成员:整形成员(实际需要保存的数据)和指向下一个结构体类型结点的指针即下一个结点的地址(至此,我们就拥有一个存放整形数据的动态数组(链表))。...无论表访问那一个结点,都需要从链表的头开始。顺序向后查找。链表的尾结点由于无后续结点c++的链表,其指针空,写作NULL。

    96520
    领券