我试图用C编写一个简单的程序,将元素存储在指针中。打印数组的元素时,我得到的是垃圾值。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAX 5
int main(int argc, char const *argv[]) {
int* a = (int*)malloc(MAX * sizeof(int));
int* b = NULL;
int* const maxAddress = a + MAX;
if(a != NULL) {
for(int index = 0; b = a, b < maxAddress; index++) {
*(a + index) = index;
printf("Value: %d, Index: %d\n", *(a + index), index);
a++;
}
}
printf("\n\n");
for(int index = 0; index < MAX; index++) // Getting junk values here
printf("Index: %d, Value: %d, Address: %p\n", index, *(a + index), a + index);
return 0;
}
答案 0 :(得分:0)
您有两个独立的增量。在for循环中,您执行index++
,而在循环结束时,您执行a++
。这意味着您的第一个写入对象是a[0]
,下一个是写入a[1 + 1]
,依此类推。基本上,您将跳过所有其他元素。
为避免执行此增量a
或index
,但不能同时进行。由于您希望index
的值增加,因此建议删除行a++
。
变量b
仅在循环开始时才使用,因此条件b = a, b < maxAddress
似乎毫无意义。它可以写为a < maxAddress
。如果我有这样的猜测,则在完整版本的代码中使用b
来保留a
的先前值用于下一次迭代。
答案 1 :(得分:0)
这是更正的代码: b应该在循环之前初始化。 for循环不正确 您应该在循环中增加b而不是a
#include <stdio.h>
#include <stdlib.h>
#define MAX 5
int main(int argc, char const *argv[]) {
int* a = (int*)malloc(MAX * sizeof(int));
int* b = a;
int* const maxAddress = a + MAX;
if (a != NULL) {
for (int index = 0; b < maxAddress; index++) {
*(a + index) = index;
printf("Value: %d, Index: %d\n", *(a + index), index);
b++;
}
}
printf("\n\n");
for (int index = 0; index < MAX; index++) // Getting junk values here
printf("Index: %d, Value: %d, Address: %p\n", index, *(a + index), a + index * sizeof(int));
return 0;
}
答案 2 :(得分:0)
语法a[index]
等效于index++
;后者会更清楚地表明您对代码的意图。
如果我们通过循环主体中的for
行(在a++
循环声明中)和a
行对您的操作进行分解,您会发现自己重新访问您实际上没有为*(a + index) accesses a[0]
a[0] a[1] a[2] a[3] a[4]
0 ? ? ? ?
分配的内存:
循环迭代#0(a =分配的地址索引= 0):
*(a + index) accesses a[2]
a[0] a[1] a[2] a[3] a[4]
0 ? 1 ? ?
循环迭代#1(a =分配+1索引= 1):
*(a + index) accesses a[6]
a[0] a[1] a[2] a[3] a[4] | MEMORY NOT BELONGING TO a
0 ? 1 ? ? 3?
在第3次迭代时,您开始写遍数组:
for
此外,在您的初始a
循环之后,您将指针malloc
递增到分配的数量的末尾,您尝试再次访问它而不将其重置为初始值,因此,访问权限甚至都不是您(您曾经认为的)分配的权限。
这对于使用free
分配的内存尤其不利,因为通常以后使用a
,但是如果没有指向已分配内存块开始的指针,则无法做到这一点。
解决方案:
请勿在初始for
循环中增加for(int index = 0; (a + index) < maxAddress; index++)
// Also valid: ...; index < MAX; ...
{
*(a + index) = index;
printf("Value: %d, Index: %d\n", *(a + index), index);
}
,并使用正确的真实条件:
export class DashboardComponent implements OnInit {
dwsubscriptions: Observable<Dwsubscription>[] = new Array();
ngOnInit() {
this.dwsubscriptions.push(
this.devicewiseService.getSubscription('Randomizer', '1', 3, 1, -1)
)
}
}