以下 C 代码给出了分段错误:
#include <stdio.h>
#include <stdint.h>
int main(){
uint32_t *a;
uint32_t idx=1233245613;
a[idx]=1233;
return 0;
}
如何在 C 中使用 uint32_t 作为数组的索引?或者如何使用可以获取 uint32_t 和 12 位数字作为索引的数组结构?
我会很感激任何帮助。
以下 C 代码给出了分段错误:
#include <stdio.h>
#include <stdint.h>
int main(){
uint32_t *a;
uint32_t idx=1233245613;
a[idx]=1233;
return 0;
}
如何在 C 中使用 uint32_t 作为数组的索引?或者如何使用可以获取 uint32_t 和 12 位数字作为索引的数组结构?
我会很感激任何帮助。
您还试图在数组中索引很远。您可能没有足够的可用内存,因此请务必检查 NULL。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main(void){
uint32_t *a;
uint32_t idx=1233245613;
//This allows you to index from 0 to 1233245613
// don't try to index past that number
a = malloc((idx+1) * sizeof *a);
if(a == NULL)
{
printf("not enough memory");
return 1;
}
a[idx]=1233;
free(a);
return 0;
}
如果您想使用“12 位数字”作为索引,则意味着您需要超过 10 亿个项目。每个项目都是一个 uint32_t,这意味着每个项目占用四个字节的内存。因此,您看到此阵列的内存总量约为 4 GB。出于性能和其他原因,数组通常不会那么大。
如果您真的需要这十亿个项目中的每一个,请查看适合实现这种巨型阵列的磁盘支持算法,也许是红黑树。
那么对于初学者来说,你需要为 a 分配空间。
当该代码运行时, a 指向您可能不拥有的内存中的一些空间。
当您尝试访问它时(实际上是当您尝试访问 + 1233245613 时),您将进入您绝对不拥有的内存空间,这是一个禁忌,会导致崩溃。
#include <stdio.h>
#include <stdint.h>
int main(){
uint32_t *a;
uint32_t idx=1233245613;
a = malloc(sizeof(unit32_t) * (idx+1));//+1 cause remember, arrays are 0-based
if(a == NULL)
{
printf("Array could not be allocated");
return 1;
}
a[idx]=1233;
free(a);//good practice to avoid memory leaks
return 0;
}
但即使这样也不能解决您使用 GIANT 数组的问题。您的标准设置(台式机甚至大多数服务器)在尝试分配 4.6GB 内存时会卡住。因此,除非您考虑到这一点,否则您可能需要退后一步,重新考虑您要做什么以及如何做。
你需要两件事:
a
,例如 uint32_t a[2000000000];哇。那是一团糟。
好的。这里有两个问题。第一个问题是您声明了一个指向整数的指针,从未将它指向任何东西,然后尝试使用它。这只是一个错误。最有可能的是,指针恰好指向一个甚至不是您的进程的有效内存的地方(或指向 NULL)。在这种情况下,任何使用它的尝试都会给你一个段错误,就像你得到的一样。
第二个问题是您试图索引它的值。即使您为指针分配了内存,我也严重怀疑您是否可以为它分配 4.8 GB。大多数计算机没有那么多内存,而且在一个连续的块中肯定没有那么多。如果您尝试对分配给数组的内存进行索引,那么任何事情都可能发生,但是如果您过去,很可能会出现段错误。
a 是一个指针,它指向任何确定的内容。你想要一个数组
uint32_t a[42];
它创建了一个由 42 个整数组成的数组。但是,您对它的访问仍然会导致问题(确切地说是未定义的行为),因为它超出了此数组或任何其他合理数组的范围。