Dad*_*dan 2 c arrays pointers memory-management
我已经研究过并且我清楚地知道数组不是指针
但是我已经学到了一些我认为可能使用指针声明声明类似数组的变量的东西.我知道的事情:
int *x;a[b]➜*(a+b)a[b][c]➜*(*(a+b)+c)a[3],它在堆栈上分配3个空的内存地址.*(a+0),*(a+1),*(a+3)是在堆栈的使用分配.
Ideone Code
#include <stdio.h>
char block[3]={1,2,3};// This line will be removed
//And would create a pointer declaration of that having array-like structure
int main() {
while(i < sizeof(block))
printf("%d", block[i++]);
//And that I still could call the contents of it even just using *(block+i)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: 123
alloca()正如其他人 在这里所指出的,它类似于malloc()但分配在栈帧的空间来代替.
但是,如本问题所述,不鼓励使用它.如果你超出堆栈,你将不会收到"好"的错误消息.相反,你会得到各种未定义的行为.但请注意,GNU libc的手册并列出了一些优势的alloca()(与它们对应的缺点,虽然).
可变长度数组是C99的一个特性,后来被降级为C11中的条件特征.VLA的可用性很大程度上取决于您正在使用的C语言,以及您是否愿意允许扩展(例如,GNU C).它的主要优点alloca()是它提供了类似数组的语义.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char* strrev(char* str)
{
size_t i, len = strlen(str);
char buffer[len]; /* Creates VLA from len variable */
for (i = 0; i < len; i++) {
buffer[len-i-1] = str[i];
}
return strncpy(str, buffer, len);
}
int main(void)
{
char text[] = "Hello world!";
printf("%s\n", strrev(text));
}
Run Code Online (Sandbox Code Playgroud)
但请注意,当数组作为参数传递给函数时,数组会衰减为简单指针.
int func(int array[128]);
int func(int *array);
Run Code Online (Sandbox Code Playgroud)
无论您选择哪种原型,take sizeof(buffer)都将产生与sizeof(char*)函数体内相同的值.
我觉得问题上有一些轻微的滑倒.我正在解决它们,因为我相信它们会帮助我们更好地理解这个问题.拥有共同的词汇量对于传达复杂的想法大有帮助.
int *x;"即使它看起来一样,那也不是解引用算子.它在你链接的同一页面上说它:
请注意,在声明指针时使用的星号(*)仅表示它是一个指针(它是其类型复合说明符的一部分),并且不应该与之前看到的取消引用操作符混淆,但也写入星号(*).它们只是两个不同的东西,用相同的符号表示.
a[3],它会在堆栈上分配3个空的内存地址."新分配的内存不为空(如何定义空内存?).除非为对象指定了初始化,否则内容是不确定的(参见§6.2.4).
a的范围."3是元素的长度,大小或数量.'a []'.
有关范围的定义,请参阅§6.2.1:
对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本的区域内可见(即,可以使用).
如果你说"优先",首先想到的是operator precedence,它决定了操作的顺序.你的意思是你想要在堆栈上分配指针吗?
如果你有一个指向有效内存块的指针
char* block = malloc(150);
Run Code Online (Sandbox Code Playgroud)
您可以像数组一样访问它:
block[6] = block[32];
Run Code Online (Sandbox Code Playgroud)