繁体   English   中英

C中的内存分配和指针

Memory Allocation and Pointers in C

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在为考试而学习,遇到了难以理解的问题。 我们正在使用指针和内存分配,而我只是在鬼混,试图看看什么改变了什么。 我有这段代码:

int * arr[10];
for(i=0; i<5;i++) 
{
    int index = i;
    arr[index] = malloc(sizeof(int*));
    int i = 2 * index;
    *arr[index] = i;
    printf("arr [%d] = %d\n", index, *arr[index]);  /* should be 0, 2, 4, 6, 8 */
}

但是我发现的是,如果我不使用* arr [index] = i,而是使用arr [index] =&i,则不需要malloc 我一直认为这两件事本质上是同一件事,但是必须保证我不了解某些关键区别,才能保证将malloc与其中之一一起使用。

我真的很困惑,为什么我真的真的需要malloc 我在内存分配方面还很陌生,我不知道何时应该使用它(显然),并且想知道是否有人可以为我解决这个问题。

5 个回复

请尝试以下代码:

int * arr[10];
for(i=0; i<5;i++) 
{
    int index = i;
    int value = 2*i;
    arr[index] = malloc(sizeof(int*));
    *arr[index] = value;
}

for (i=0; i<5; i++)
{
    int index = i;
    printf("arr [%d] = %d\n", index, *arr[index]);  /* should be 0, 2, 4, 6, 8 */
}

如果您建议进行更改,则现在将具有未定义的行为。 而此代码仍然有效。

您将有未定义的行为,因为*arr[0]现在指向一块具有左作用域的堆栈内存。


您的malloc实际上应该是malloc(sizeof(int)) 您是为int而不是int *分配空间。

是的,我认为很难理解,因为我在for中间重新定义了。 我现在将重写代码。 我写了i而不是索引,写了2 * i而不是重新定义的i。

int * arr[10];
for(i=0; i<5;i++) 
{
    arr[i] = malloc(sizeof(int));
    *arr[i] = 2*i;
    printf("arr [%d] = %d\n", i, *arr[i]);  /* should be 0, 2, 4, 6, 8 */
}

您在这里并不需要动态内存,您知道将使用数组0-4。 当您不知道需要多少数据时,就需要动态内存。 编写此代码是为了使您的其余代码仍然可以使用,但是没有malloc。

int array[5];
int **arr=array;

以下代码意味着,array [index]应该指向我存储在其中的内存地址。它不会复制i中的值,因此当您更改i或删除i时,这将导致该指针为错误,并在以后引起问题。 你不应该这样做。

arr[index] = &i

这样写:

*arr[index] = i;

意思是:将i的值复制到arr[index]指向的内存位置(在代码的前面分配)。

arr[index] = &i;

意思是:将i的地址复制到arr[index]

在您的代码中, i是在for循环内自动创建的,并且仅存在于该循环内。 一旦退出循环(作用域),用于存储i的内存就可以释放给任何新创建的变量的一部分。

正如sharth所建议的那样,请尝试查看原始for循环之外的值,以查看一些有趣的结果。

一个关键的区别是&i将不复存在一旦i超出范围(或者,更确切地说,是一块内存可以为别的东西......这可能不会包含你以为它所包含的内容可以重复使用)。

编辑:我说下面你没有显示i是如何宣布的。 实际上,您重新声明了它,如果i在循环中使用了,则隐藏原始值。 无论如何, i将在循环结束时或可能在例程结束时超出范围。

您没有在这里显示i是如何声明的。 但是,在大多数情况下,它可能是局部变量,也可能是传递给方法的参数。 无论哪种情况,该变量的空间都在堆栈上声明。 您可以使用&i该变量的地址,但是该变量将在方法结束后消失,并且代码会将这些值弹出堆栈。 您可能会很幸运,只要您需要,就可以保持其价值不变。 但是,一旦调用另一种方法,该值很可能会被覆盖并繁荣,那么您的程序充其量只能表现为错误。

如果i被全局声明,则可以避免。

此外,即使更改i的值,您仍指向相同的地址。 如果在例程结束时打印出了数组的所有值,您会发现它们都是相同的值-放入数组中的最后一个值。 这是因为数组中的每个条目都指向相同的位置。

1 C中的指针和内存分配

程序: 问题:有什么区别: 从我的理解* z指向x和* y的地址指向x,但是* y指向x不需要x的地址? 我真的不明白这两个变量是怎么回事。 编辑:我也想知道何时知道何时在堆栈上或堆上分配变量? 为什么在堆栈上分配x,y和z? 为什么* y,** y,* ...

4 C ++中的指针内存分配

现在-您会注意到,我在类似创建的其他数组的代码中有大量注释掉了-我的代码在没有注释的情况下可以工作-但是当我注释它们时,在输出“ sun”之后但在“ shine”之前崩溃。 我尝试使用其他参数来创建要创建的内存长度-例如MedianAmt,其中包括其他变量和实际数字。 我也尝试过使用l ...

2012-03-06 21:05:25 1 214   c++
5 C中的指针和动态内存分配

我对C语言还很陌生,并且对指针和动态内存分配有些困惑。 我想做的是从命令行参数中读取并将其存储在动态内存分配中。 然后将它们打印出来。 例如,如果我输入./rpd 4 3 2 3 8,则应减小argv [1](4),然后跟随其他3个值(3、2、3、8)。 输出应如下所示: 人1有3 ...

6 分配超大内存-c中的指针

我真的不明白写这篇文章的兴趣 为什么将packet当作char ,为什么不写packet = malloc(sizeof(struct iphdr)); 或更简单的ip = malloc(sizeof(struct iphdr)); ? ...

7 为C中的数组分配指针的内存

我有一个定义为的指针数组 使用malloc分配内存时 要么 我收到“可疑指针转换”警告 为什么? ...

2012-01-16 15:23:55 5 2574   c
8 使用指针时在C中的内存分配

运行以下程序安全吗? 我运行了它,发现它给出了正确的输出。 但是,以下陈述安全吗? 会不会导致这些字符填充未分配的空间? ...

2014-07-29 22:13:31 2 76   c
9 了解c中的内存分配和指针

这个问题已经在这里有了答案: 整页Malloc 5个答案 我正在尝试加深对操作系统的了解。 我的Linux系统使用4096字节的页面大小。 我从运行命令得到的: 我也知道页面是寻址最少的存储单元。 因此,我尝试创建精确的分配方式:为char指针分配40 ...

10 C ++中的指针和内存分配

我最近刚开始使用C ++,但我不太确定我掌握了指针的概念及其与数组的连接。 我有两个类,Term和Polynom。 我有一个主循环,允许用户输入2个数字。 然后将这些数字添加到“ Term”对象,然后将该对象添加到“ Polynom”对象。 每次执行循环时,都会创建一个新的“ Term” ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM