标签: c

全局变量,共享库和-fPIC效果

我制作了一段代码,其中包含一个动态库(lib.c)和一个主可执行文件(main.c).在这两个文件,我定义一个名为一个全局变量:int global.不是很聪明,但这不是问题.

当我编译动态库时,该-fPIC选项似乎是强制性的:

gcc lib.c -fPIC -shared -o lib.so
Run Code Online (Sandbox Code Playgroud)

否则我得到:

/usr/bin/ld: /tmp/ccpUvIPj.o: relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)

当我编译可执行文件时,它不是.

gcc main.c -fPIC -ldl
gcc main.c -ldl
Run Code Online (Sandbox Code Playgroud)

两者都有效,但有不同的行为,我无法解释,是吗?:

使用-fPIC,main.c中的global和lib.c中的global是相同的变量:

global main: 23 (0x601050)
global lib: 23 (0x601050)
Run Code Online (Sandbox Code Playgroud)

没有-fPIC,lib.c中的global与main.c中的global不相关:

global main: 23 (0x601048)
global lib: 0 (0x7f7742e64028)
Run Code Online (Sandbox Code Playgroud)

这是来源:

lib.c

#include <stdio.h>
#include <stdlib.h>

int global;

int f_one() {

    printf("global lib: %d (%p)\n", global, &global); …
Run Code Online (Sandbox Code Playgroud)

c fpic dynamic-library

13
推荐指数
1
解决办法
5739
查看次数

使用可变长度数组是否安全?

我对可变长度数组感到担忧.当我想动态分配一个数组时,如果无法分配足够的内存,我将得到null,我可以在程序中正确响应.对于可变长度数组,我没有得到这些信息.我该怎么办?

c variable-length-array

13
推荐指数
1
解决办法
2256
查看次数

实现C预处理器

多年来已经写了很多关于实现解析器的文章,但是C预处理器与典型解析器的任何阶段并不完全相同,并且无疑实现它的特定缺陷需要注意.有没有人知道有关实现C预处理器主题的任何内容?

c compiler-construction parsing c-preprocessor

13
推荐指数
2
解决办法
6356
查看次数

浮点计算如何确定?

浮点计算既不是关联的,也不是处理器上的分配.所以,

(a + b) + c 不等于 a + (b + c)

a * (b + c)不等于a * b + a * c

有没有办法执行不会给出不同结果的确定性浮点计算.它对于单处理器来说是确定性的,但是如果线程增加一个总和,它在多线程程序中就不是确定性的,因为线程可能有不同的交错.

所以我的问题是,如何在多线程程序中实现浮点计算的确定性结果?

c deterministic

13
推荐指数
1
解决办法
4269
查看次数

使用n [c-'0']的真正用途是什么?

我是C的新手,我遇到了这样的代码:

int n[10];
if(c>='0' && c<='9')
++n[c-'0']
Run Code Online (Sandbox Code Playgroud)

if循环中为什么我们必须使用单引号0,使用它,为什么我们不能立即定义0为整数?在第二行代码中++n[c-'0'],使用像这样的数组是什么意思,为什么我们需要在数组索引中减去0(再次为什么在这个上下文中使用单引号?)c

如果我喜欢这样n[c-'0'],index operation(c-'0')的结果将是一个字符或整数?

鉴于任何人都可以说我,这个阵列的实际用途是什么,有什么缺点呢?

提前致谢.

c c++ arrays

13
推荐指数
3
解决办法
6023
查看次数

在Linux内核源代码中实现系统调用/陷阱

我目前正在学习操作系统使用陷阱来促进Linux内核中的系统调用.我在traps.c中找到了陷阱表,并在entry.S中实现了许多陷阱.

但是,我被指示在Linux内核中找到两个系统调用的实现,它使用陷阱来实现系统调用.虽然我可以找到陷阱本身的定义,但我不确定内核中的其中一个陷阱的"调用"是什么样的.因此,我正在努力寻找这种行为的一个例子.

在有人问之前,是的,这是作业.

作为一个注释,我正在使用Github浏览内核源代码,因为kernel.org已关闭:https: //github.com/torvalds/linux/

c kernel system-calls linux-kernel

13
推荐指数
2
解决办法
3712
查看次数

在堆栈中间找到元素

我在接受采访时被问到这个问题.问题是我会得到一个堆栈,必须在堆栈的中间位置找到元素."top"索引不可用(这样你就不会pop()top/2次并返回答案).假设当pop()返回-1时你将到达堆栈的底部.不要使用任何其他数据结构.

例如:

stack   index
----- 
 2    nth element
 3
 99
 .
 1    n/2 th element
 .
 -1   bottom of the stack(0th index)
Run Code Online (Sandbox Code Playgroud)

答案:1(我的意思不是中位数.找到中间位置的元素)

递归是唯一的方法吗?

谢谢,

PSY

c algorithm recursion data-structures

13
推荐指数
2
解决办法
4862
查看次数

是否可以在Android中设置与sched_setaffinity的亲和力?

是否可以在使用Android NDK编译的本机C代码中设置CPU亲和力?由于系统使用的是Linux内核,因此应该可以使用sched_setaffinity/sched_getaffinity函数,但是当我使用NDK进行编译时,我会收到错误抱怨cpu_set_t类型未知(用作函数的参数) .有没有其他方法可以实现这一目标?当我使用CodeSourcerys ARM编译器(arm-none-linux-gnueabi-gcc)编译时,这似乎不是问题,因此系统显然支持所需的系统调用.

c multithreading multicore android-ndk

13
推荐指数
1
解决办法
1万
查看次数

C - 枚举的前向声明?

在C中转发枚举对我来说不起作用.我搜索了互联网和stackoverflow,但所有关于枚举器前向声明的问题都引用了c ++.你在C中声明枚举器怎么办?将它们放在每个文件的顶部(或包含在内),以便文件中的所有函数都可以访问它们?谢谢

c enums enumeration forward-declaration

13
推荐指数
2
解决办法
2万
查看次数

MPI分区矩阵成块

我想将矩阵分区为块(而不是条带),然后使用MPI_Scatter分配这些块.

我提出了有效的解决方案,但我认为它远非"最佳实践".我有8x8矩阵,填充0到63之间的数字.然后我将它分成4个4x4块,使用MPI_Type_vector并通过MPI_Send分配它,但这需要一些额外的计算,因为我必须计算大矩阵中每个块的偏移量.

如果我使用散点图,则第一个(左上角)块传输正常,但其他块不传输(块的开始错误偏移).

那么可以使用MPI_Scatter传输矩阵块,或者进行所需分解的最佳方法是什么?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

#define SIZE 8


int main(void) {

        MPI_Init(NULL, NULL);
        int p, rank;
        MPI_Comm_size(MPI_COMM_WORLD, &p);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        char i;

        char a[SIZE*SIZE];
        char b[(SIZE/2)*(SIZE/2)];

        MPI_Datatype columntype;
        MPI_Datatype columntype2;

        MPI_Type_vector(4, 4, SIZE, MPI_CHAR, &columntype2);
        MPI_Type_create_resized( columntype2, 0, sizeof(MPI_CHAR), &columntype );
        MPI_Type_commit(&columntype);

        if(rank == 0) {
                for( i = 0; i < SIZE*SIZE; i++) {
                        a[i] = i;
                }

                for(int rec=0; rec < p; rec++) {
                        int offset = (rec%2)*4 + (rec/2)*32;
                      MPI_Send (a+offset, …
Run Code Online (Sandbox Code Playgroud)

c scatter matrix mpi

13
推荐指数
1
解决办法
2万
查看次数