好吧我有我的阵列:
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的输出都不同,我认为这意味着它的垃圾。
答案 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)
您为阵列分配了内存,但是您没有将该内存的内容设置为任何内容。所以你的数组充满了随机垃圾。