【问题标题】:print the pointer value which is already incremented打印已经递增的指针值
【发布时间】:2019-04-12 20:14:30
【问题描述】:

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

我得到以下输出:问题是 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;
}

【问题讨论】:

    标签: c


    【解决方案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;

    【讨论】:

    • 非常感谢,您也可以在超链接问题中输入相同的答案。我也会接受它,因为您的回答确实对我有帮助:)\
    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2011-01-29
    • 2012-03-03
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多