错误循环遍历c中的整数数组

时间:2017-05-20 22:07:16

标签: c arrays memory-management integer

好吧我有我的阵列:

unsiged int *arr = (unsigned int*)malloc(200 * sizeof(unsigned int));

像这样声明,我写了一个循环,循环遍历数组的每个元素,并以元素作为参数调用一个函数,如下所示:

for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
    sprintf(buffer, "/proc/%zu/cmdline", arr[i]);
    printf("/proc/%x/cmdline", arr[0]);
    printf("/proc/%zu/cmdline", arr[i]);
    checkIfRunning(buffer);
}

checkIfRunning函数包含:

void checkIfRunning(char *filepath) {
    FILE *fh;
    char buf[500];
    fh = fopen(filepath, "r");

   if (!fh)
       exit(1);

我的代码总是在退出(1)时退出,我从两个printf语句中得到以下(错误的)输出:

/proc/bbb07a63/cmdline
/proc/3148905059/cmdline

我做错了什么

请注意我是c的新手,如果有新手问题我很抱歉,还要注意每次printf的输出都不同,我认为这意味着它的垃圾。

2 个答案:

答案 0 :(得分:3)

对于unsigned int *arr,表达式sizeof(arr)是指针值的大小(例如32位系统上的4个字节),而不是此指针指向的“长度”。这与unsigned int arr[100]之类的声明不同,其中sizeof(arr)会为您提供100*sizeof(unsigned int)。您可能从像sizeof(arr) / sizeof(arr[0])这样的数组声明中接管了模式unsigned int[100],但这不能用于动态分配的内存。所以你宁可写for (size_t i = 0; i < 200; i++),也不要写#define ARRSIZE 200,然后使用ARRSIZE代替malloc和循环。

其次,如GrahamS所述,您不会显示任何初始化内存的代码。如果没有这样的初始化,程序的行为是不确定的。

答案 1 :(得分:1)

您为阵列分配了内存,但是您没有将该内存的内容设置为任何内容。所以你的数组充满了随机垃圾。