c - 带有指针的 extern 关键字无法传递正确的值

标签 c

我正在使用 extern 在两个 C 文件之间传递值:

//For the first case as follows: I was not able to print out correct values. 
//Everything print out is 0. 
//In file1.c,
int * element_list;

void set_element()
{
    ......
    element_list = malloc(4 * sizeof(int));
    for (i = 0; i < 4; i++) {
         element_list[i] = i;
    }
    ......
}



//In file2.c,

extern int * element_list;

void print_element()
{
    ......
    for (i = 0; i < 4; i++) {
       printf("%d", element_list[i]);
    }
    ....
}

如果我像这样将 element_list 初始化为数组,我就能打印出正确的值。

// After changing the following two lines in two files,
// I was able to print out correct values 
//In file1.c, change to
int element_list[MAX_NUM_ELEMENTS];

//In file2.c, change to 
extern int element_list[MAX_NUM_ELEMENTS];

我不明白为什么使用 malloc 会导致这个问题。在打印出来之前我没有将元素重置为 0。在我的程序中,为了得到正确的结果,我只用数组替换了 malloc,程序中的其他一切都完全一样。

最佳答案

/* first file aaa.c */
extern void print_val();

int* element_list;
int num_elements = 10;
int main() {
    int i;
    element_list = malloc(num_elements * sizeof(int));
    for (i = 0; i < num_elements; i++) {
        element_list[i] = i;
    }
    print_val();
    return 0;
}

请注意,我在主函数中调用了 print_val() 函数,以确保我调用的是文件 bbb.c 中的外部函数

/* Second file bbb.c */
extern int *element_list;

void print_val()
{
    int j;

    for(j = 0; j < 10; j++) {
        printf("val = %d\n", element_list[j]);
    }
}

要在 Linux 机器上编译它,请使用:

gcc aaa.c bbb.c -o output

然后运行它,我得到了以下信息:

ccampes@campes tmp $ ./output 
val = 0
val = 1
val = 2
val = 3
val = 4
val = 5
val = 6
val = 7
val = 8
val = 9

我认为您编译它的方式可能是错误的。 我希望这可以解决您的问题。

关于c - 带有指针的 extern 关键字无法传递正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32596098/

相关文章:

c - 字符串附加功能不起作用

c - 使用 A Vedaldi 的 sift 实现

objective-c - CFMutableArrayRef 可以存储简单的整数值吗?

C结构声明问题

c - sqlite3 关闭语句不起作用

C. 链表。在另一个元素之前插入一个元素

php - 压缩和加密基准比较

c - linux 内存管理 - 如何获得 "Random xxx offset"?

c - 如何解决链接器库顺序问题?

c - '!!' 是 C 中的现有运算符吗?