gpt4 book ai didi

c - 打印已经递增的指针值

转载 作者:行者123 更新时间:2023-11-30 14:40:11 27 4
gpt4 key购买 nike

这是 This question 的延续,我一直在努力实现那里给出的建议。我能够以某种方式打印函数内的值,但无法在调用者函数(主函数)中打印它。

我得到以下输出:问题是 print_affinity 函数内的 printf 是正确的,后来返回到 main。但是当我尝试打印指针值时,它显示的值不正确。我猜测这是因为指针已经在 print_affinity 函数内递增。

如何在调用函数中打印正确的值?

sched_getcpu = 3
sched_getaffinity =
*ret is 0 //correct
*ret is 1 //correct
*ret is 2 //correct
*ret is 3 //correct
*(p + 0) : 3
*(p + 1) : 0
*(p + 2) : 0
*(p + 3) : 0

代码:

#define _GNU_SOURCE
#include <assert.h>
#include <sched.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int * print_affinity() {
cpu_set_t mask;
long nproc, i;
int enabled_core,j;
int *ret = (int *) malloc(sizeof (int));
if (sched_getaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
perror("sched_getaffinity");
assert(false);
} else {
nproc = sysconf(_SC_NPROCESSORS_ONLN);
printf("sched_getaffinity = ");
for (i = 0; i < nproc; i++) {
enabled_core = CPU_ISSET(i, &mask);
if ( enabled_core == 1 )
{
*ret = i;
printf("*ret is %d\n",*ret); //correct output
}
}
}
return ret;
}

int main(void) {
cpu_set_t mask;
long nproc;
int *p , i;
printf("sched_getcpu = %d\n", sched_getcpu());
nproc = sysconf(_SC_NPROCESSORS_ONLN);
p=print_affinity();
for ( i = 0; i <nproc ; i++ ) {
printf( "*(p + %d) : %d \n", i, *(p + i)); //incorrect output
//printf( "*(p + %d) : %d \n", i-nproc, *(p -nporc + 1)); //incorrect output
}
free(p);
return EXIT_SUCCESS;
}

最佳答案

int *ret = (int *) malloc(sizeof (int)); 仅为一个整数分配空间。

*ret = i; 不会增加指针,它只是更改它指向的值。

所以 ret 的值是某个地址,您首先在其中写入 0,然后写入 1,依此类推。

*(p + i) 当您执行此操作时,您将取消引用内存,该内存不是由您的 malloc 调用分配的,它可以用于某些用途否则,甚至更糟糕的情况可能是只读或位于进程的地址空间之外,从而导致崩溃。

我认为你想要的是:

int *ret = (int *) malloc(sizeof(int) * nproc);//为 nproc 整数分配

然后:

ret[i] = i;

关于c - 打印已经递增的指针值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55658837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com