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

时间:2014-02-27 15:22:36

标签: c arrays pointers memory-management

我研究过,我清楚地了解arrays are not pointers
但我已经学到了一些我认为可能使用指针声明声明类数组变量的东西。我知道的事情:

  • Declaring a pointer使用取消引用运算符:int *x;
  • 声明指针时,我知道它只保存内存地址......
  • 使用指针回显数组中的值将是:
  • 声明a[3]时,它会在堆栈上分配3个空的内存地址。
    所以,就像说*(a+0)*(a+1)*(a+3)在堆栈上分配使用。 Array <code>a</code> given a scope of 3 of type int在这张照片上,我给了a范围为3

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

我可以使用指针做那样的事情吗?
使指针指向指向获取不同地址的指针很容易**p

我期待有可能创建一个指针声明,从当前地址和它所遵循的地址分配内存,这样它就像阵列式结构

示例:我知道int a[3];使用指针声明不仅仅是int *(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;
}

输出:123

6 个答案:

答案 0 :(得分:7)

alloca()

正如others here所指出的那样,它与malloc()类似,但却在堆栈框架中分配空间。

然而,正如本question所述,不鼓励使用它。如果你超出堆栈,你将不会收到“好”的错误消息。相反,你会得到各种未定义的行为。但请注意,GNU libc手册确实列出了alloca() 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)); } (虽然它们对应advantages)。

VLA(可变长度数组)

可变长度数组是C99的一个特性,后来被降级为disadvantages中的条件特征。 VLA的可用性很大程度上取决于您正在使用的C语言,以及您是否愿意允许扩展(例如,GNU C)。与int func(int array[128]); int func(int *array); 相比,它的主要优点是它提供了类似数组的语义。

sizeof(buffer)

腐朽指针

但请注意,当数组作为参数传递给函数时,数组会衰减为简单指针。

sizeof(char*)

无论您选择哪种原型,取int *x;将在函数体内产生与a[3]相同的值。

问题中的不准确

我觉得问题中有一些轻微的滑倒。我正在解决它们,因为我相信它们会帮助我们更好地理解这个问题。拥有共同的词汇量对于传达复杂的想法有很长的路要走。

“声明指针使用取消引用运算符:a

即使它看起来相同,也就是取消引用运算符。它在C11

中说出来
  

请注意,在声明指针时使用的星号(*)仅表示它是指针(它是其类型复合说明符的一部分),并且不应该与之前看到的取消引用运算符相混淆,但也会用星号(*)编写。它们只是两个不同的东西,用相同的符号表示。

“声明3时,它会在堆栈上分配3个空内存地址。”

新分配的内存不为空(如何定义空内存?)。内容是不确定的,除非为对象指定了初始化(参见very same page you linked)。

“在这张照片上,我给了operator precedence 3的范围。”

char* block = malloc(150); 长度尺寸元素数量。 'a []'。

有关范围的定义,请参阅§6.2.4

  

对于标识符指定的每个不同实体,标识符 visible (即,可以使用)仅在名为 scope 的程序文本区域内。

“我想使用指针”

执行相同的内存地址分配声明优先级

如果你谈到“优先”,首先想到的是block[6] = block[32]; ,它决定了操作发生的顺序。你的意思是你想要在堆栈上分配指针吗?

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

如果你有一个指向有效内存块的指针

{{1}}

您已经可以像数组一样访问它了:

{{1}}

答案 1 :(得分:6)

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

答案 2 :(得分:1)

你的条款让我感到困惑。

无论如何,如果你想问的是你是否可以在(调用者的)堆栈帧中动态分配内存?

答案是肯定的,您可以使用alloca(3)来完成。此函数类似于malloc(),但不是在所谓的堆中分配内存,而是在当前堆栈帧中分配内存。

答案 3 :(得分:1)

根据我对你的问题的理解。正如你在指定的第一个链接中所解释的那样,当你试图访问它的成员时,通常会将数组作为指针进行衰减(处理)。

如果你试图在运行时分配内存而指针就像数组一样

您可以使用malloc

为代码执行某些操作
//  3 memory location's of size `int(4)` being allocated in heap who's starting address is pointed by `p` (returned to `p` by malloc)

x = 3; 
int *p = malloc(x*sizeof(int)) // for 1 2 3
int i = 0;  
p[i++] = 1;  //*(p+ i++)
p[i++] = 2;  //*(p+ i++)
p[i++] = 3;  //*(p+ i++)
i = 0;

int main() {
    while(i++ < x)      
    printf("%d", p[i++]);  // printf("%d", *(p+i)); 
    return 0;
}

或者你想要堆栈中的内存你使用其他人指定的alloca(3)。

答案 4 :(得分:0)

我不清楚你的问题究竟是什么,但这是解决方案:

#include <stdio.h>
char block[]={1,2,3};
char *p=block;
int main() {
    int i=0;
    while(i < sizeof(block))
    {
    printf("%d", *(p+i));
    i++;
    }
return 0;
}

答案 5 :(得分:0)

  

当声明[3]时,它在堆栈上分配3个空的内存地址。

声明sometype a[3];时,它会使用自动存储分配3 连续 _cells_和未定义内容(非“空”)(不一定,但通常是堆栈)。

  

我想做同样的内存地址分配优先级

无论这意味着什么,这里都是黑暗中的刺,所有元素都是连续的:

char *line = "hello\0world\0goodbye\0world";
char *argv[] = {line+0, line+6, line+12, line+20};