打印已经增加的指针值

时间:2019-04-12 20:14:30

标签: c

这是https://hyperledger.github.io/composer/latest/installing/installing-prereqs.html的延续,我一直在尝试执行那里给出的建议。我以某种方式能够在函数内打印该值,但不能在调用者函数(主)中打印它。

我得到以下输出:问题是printf函数内的print_affinity是正确的,后来又返回到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;
}

1 个答案:

答案 0 :(得分:1)

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

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

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

*(p + i)执行此操作时,您将取消引用malloc调用未分配的内存,该内存可能用于其他用途,甚至可能是只读的或进程的地址空间之外,从而导致崩溃。

我认为您想要的是:

int *ret = (int *) malloc(sizeof(int) * nproc);// allocating for nproc integers

然后:

ret[i] = i;