使用指针的数组内存地址分配声明的相同优先级

Dad*_*dan 2 c arrays pointers memory-management

我已经研究过并且我清楚地知道数组不是指针
但是我已经学到了一些我认为可能使用指针声明声明类似数组的变量的东西.我知道的事情:

  • 声明指针使用解除引用运算符:int *x;
  • 在声明指针时,我知道它只保存内存地址......
  • 使用指针回显数组中的值将是:
  • 声明时a[3],它在堆栈上分配3个空的内存地址.
    因此,它是好像是说*(a+0),*(a+1),*(a+3)是在堆栈的使用分配. 数组<code>a</code>3的范围</noimg></li>
</ul>

<p><strong>我想使用指针执行相同的内存地址分配声明优先级</strong></p>

<p>我可以使用指针做那样的事吗?<br>将指针声明指向指向获取不同地址的指针很容易<code>**p</code><br></p>

<p>我期待有可能创建一个指针声明,从当前地址和它遵循的地址分配内存,所以它将是类似数组的结构</p>

<p>示例:我知道<code>int a[3];</code>使用指针声明不会只是<code>int *(a+3)</code>
<br><em>如果我问的是不可能请回答原因.</em></p>

<hr>

<p>这是普通数组声明和调用的简单代码:<a rel=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

MBl*_*anc 7

alloca()

正如其他人 在这里所指出的,它类似于malloc()但分配在栈帧的空间来代替.

但是,如本问题所述,不鼓励使用它.如果你超出堆栈,你将不会收到"好"的错误消息.相反,你会得到各种未定义的行为.但请注意,GNU libc的手册列出了一些优势alloca()(与它们对应的缺点,虽然).

VLA(可变长度阵列)

可变长度数组是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).

"在这张照片上,我给出了3 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)


Val*_*ity 6

如果我正确地理解了这个问题你正在寻找alloca这会在堆栈上(在当前的堆栈帧中)分配一个任意大小的缓冲区并返回一个指向它的指针.当它在堆栈上时,它当然会在函数返回时变为无效.