有没有办法用C语言更改目录?

有没有办法可以通过执行C程序 更改到任何目录 ?

sizeof在可变长度数组上的行为(仅限C)

我的问题是当传递的参数是动态数组变量长度数组时, sizeof()行为如何。 我们来看一个例子: int fun(int num_of_chars) { char name_arr[num_of_chars] = {0}; /* Do something*/ return sizeof(name_arr); } 在这个例子中,很明显返回值不是编译时常量。 因为大小取决于num_of_chars运行num_of_chars 。 引用C99标准(6.5.3.4): sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。 大小由操作数的类型确定。 结果是整数。 如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量。 我从[….操作数被评估….]中可以理解的是,当为sizeof()传递的参数是动态数组变量长度数组时, sizeof() ‘的行为类似于’一个函数,而不是一个函数运营商 。 我的理解是对的吗?

如何在没有编译器浪费指令归零上层元素的情况下将标量合并到向量中? 英特尔内在函数的设计限制?

我没有特定的用例; 我问这是否真的是英特尔内在函数中的设计缺陷/限制,或者我是否只是遗漏了某些内容。 如果你想将标量浮点数与现有向量相结合,那么使用英特尔内在函数时,如果没有高元素归零或将标量广播到向量中,似乎没有办法实现。 我没有研究过GNU C本机向量扩展和相关的内置函数。 如果额外的内在优化,这不会太糟糕,但它不与gcc(5.4或6.2)。 使用pmovzx或insertps作为载荷也没有好的方法,因为它们的内在函数只采用向量args的相关原因。 (并且gcc不会将标量 – >向量加载到asm指令中。) __m128 replace_lower_two_elements(__m128 v, float x) { __m128 xv = _mm_set_ss(x); // WANTED: something else for this step, some compilers actually compile this to a separate insn return _mm_shuffle_ps(v, xv, 0); // lower 2 elements are both x, and the garbage is gone } gcc 5.3 […]

在C中构建对数函数而不使用float类型

我需要重写日志函数(基数2或基数10无关紧要),不使用float类型,但我需要得到小数点后几位小数的精度。 (就像一个float * 100在整数类型中得到2 1.4352数,例如:如果1.4352是结果,我的函数应该返回类似143 ( int类型)的东西,我知道最后2个数字是小数。 我在stackoverflow上找到了一些方法,比如: 如何在不使用C#内置数学函数的情况下计算基数为2的对数? 但是所有这些都返回int精度(避免小数)。 我不知道如何处理这个问题,所以问题是: 如何编码(和/或更改)整数log实现以支持十进制结果?

C指向二维数组

我知道有几个问题可以提供良好(和工作)的解决方案,但没有恕我直言,这清楚地说明了实现这一目标的最佳方法。 所以,假设我们有一些2D数组: int tab1[100][280]; 我们想要制作一个指向这个2D数组的指针。 为实现这一目标,我们可以做到: int (*pointer)[280]; // pointer creation pointer = tab1; //assignation pointer[5][12] = 517; // use int myint = pointer[5][12]; // use 或者,或者: int (*pointer)[100][280]; // pointer creation pointer = &tab1; //assignation (*pointer)[5][12] = 517; // use int myint = (*pointer)[5][12]; // use 好的,两者似乎都运作良好。 现在我想知道: 什么是最好的方式,第一或第二? 两者都等于编译器? (速度,性能…) 这些解决方案中的一种比其他解决方案占用更多内存? 开发人员更常使用的是什么?

x86上的错误对齐指针

有人提供一个示例是否会因为错位而将指针从一种类型转换为另一种类型失败? 在对这个答案的评论中,两者都表示做了类似的事情 char * foo = …; int bar = *(int *)foo; 如果启用了对齐检查,即使在x86上也可能导致错误。 我在GDB中通过set $ps |= (1<<18)设置了alignment-check标志后试图产生错误条件,但没有任何反应。 工作(即非工作;))示例是什么样的? 答案中的代码片段都没有在我的系统上失败 – 我将尝试使用不同的编译器版本,稍后在不同的PC上。 顺便说一句,我自己的测试代码看起来像这样(现在也使用asm来设置AC标志和未对齐的读写): #include int main(void) { #ifndef NOASM __asm__( “pushf\n” “orl $(1<<18),(%esp)\n" "popf\n" ); #endif volatile unsigned char foo[] = { 1, 2, 3, 4, 5, 6 }; volatile unsigned int bar = 0; bar […]

在C中交换指针(char,int)

当我在C中交换指针时,我一直在努力理解不同的行为。如果我想交换两个int指针,那么我可以做 void intSwap (int *pa, int *pb){ int temp = *pa; *pa = *pb; *pb = temp; } 但是,如果我想交换两个char指针,我需要做类似的事情 void charSwap(char** a, char** b){ char *temp = *a; *a = *b; *b = temp; } 因为如果我这样做 void charSwap(char* a, char* b){ char temp = *a; *a = *b; *b = temp; } 编译器抱怨表达式* a = […]

指针作为C中的函数参数

如果我有这个代码,例如: int num = 5; int *ptr = &num; 以下两个function有什么区别? void func(int **foo); void func(int *foo); 我在哪里调用函数: func(&ptr); 我意识到两者的前者将指针指向一个参数,而第二个只取一个指针。 如果我传入func(&ptr) ,我实际上是在传入一个指针。 指针指向另一个指针有什么区别? 我相信后者会给出一个不兼容的警告,但只要你知道你在做什么,似乎细节无关紧要。 似乎可能为了可读性和理解,前者是更好的选择(2星指针),但从逻辑的角度来看,有什么区别?

使用GNU C内联汇编在VGA内存中绘制字符

我正在学习用DOS和内联汇编在DOS下进行一些低级VGA编程。 现在我正在尝试创建一个在屏幕上打印出一个角色的function。 这是我的代码: //This is the characters BITMAPS uint8_t characters[464] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x50, 0x50,0x00,0x00,0x00,0x00,0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x00,0x20,0xf8,0xa0, 0xf8,0x28,0xf8,0x00,0xc8,0xd0,0x20,0x20,0x58,0x98,0x00,0x40,0xa0,0x40,0xa8,0x90, 0x68,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x40,0x40,0x40,0x20,0x00, 0x20,0x10,0x10,0x10,0x10,0x20,0x00,0x50,0x20,0xf8,0x20,0x50,0x00,0x00,0x20,0x20, 0xf8,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x40,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x08,0x10,0x20,0x40,0x80, 0x00,0x70,0x88,0x98,0xa8,0xc8,0x70,0x00,0x20,0x60,0x20,0x20,0x20,0x70,0x00,0x70, 0x88,0x08,0x70,0x80,0xf8,0x00,0xf8,0x10,0x30,0x08,0x88,0x70,0x00,0x20,0x40,0x90, 0x90,0xf8,0x10,0x00,0xf8,0x80,0xf0,0x08,0x88,0x70,0x00,0x70,0x80,0xf0,0x88,0x88, 0x70,0x00,0xf8,0x08,0x10,0x20,0x20,0x20,0x00,0x70,0x88,0x70,0x88,0x88,0x70,0x00, 0x70,0x88,0x88,0x78,0x08,0x70,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x30,0x30, 0x00,0x30,0x10,0x20,0x00,0x00,0x10,0x20,0x40,0x20,0x10,0x00,0x00,0xf8,0x00,0xf8, 0x00,0x00,0x00,0x00,0x20,0x10,0x08,0x10,0x20,0x00,0x70,0x88,0x10,0x20,0x00,0x20, 0x00,0x70,0x90,0xa8,0xb8,0x80,0x70,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x00,0xf0, 0x88,0xf0,0x88,0x88,0xf0,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0xe0,0x90,0x88, 0x88,0x90,0xe0,0x00,0xf8,0x80,0xf0,0x80,0x80,0xf8,0x00,0xf8,0x80,0xf0,0x80,0x80, 0x80,0x00,0x70,0x88,0x80,0x98,0x88,0x70,0x00,0x88,0x88,0xf8,0x88,0x88,0x88,0x00, 0x70,0x20,0x20,0x20,0x20,0x70,0x00,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x90,0xa0, 0xc0,0xa0,0x90,0x88,0x00,0x80,0x80,0x80,0x80,0x80,0xf8,0x00,0x88,0xd8,0xa8,0x88, 0x88,0x88,0x00,0x88,0xc8,0xa8,0x98,0x88,0x88,0x00,0x70,0x88,0x88,0x88,0x88,0x70, 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x00,0x70,0x88,0x88,0xa8,0x98,0x70,0x00,0xf0, 0x88,0x88,0xf0,0x90,0x88,0x00,0x70,0x80,0x70,0x08,0x88,0x70,0x00,0xf8,0x20,0x20, 0x20,0x20,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88,0x88,0x50, 0x20,0x00,0x88,0x88,0x88,0xa8,0xa8,0x50,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00, 0x88,0x50,0x20,0x20,0x20,0x20,0x00,0xf8,0x10,0x20,0x40,0x80,0xf8,0x00,0x60,0x40, 0x40,0x40,0x40,0x60,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x30,0x10,0x10,0x10, 0x10,0x30,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 0x00,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8}; /************************************************************************** * put_char * * Print char * **************************************************************************/ void put_char(int x ,int y,int […]

为什么需要前瞻性声明?

可能重复: C ++应该消除头文件吗? 在像C#和Java这样的语言中,没有必要在使用它之前声明(例如)一个类。 如果我理解正确,这是因为编译器对代码进行了两次传递。 在第一个中它只是“收集可用信息”,在第二个中它检查代码是否正确。 在C和C ++中,编译器只进行一次传递,因此当时所有东西都需要可用。 所以我的问题基本上就是为什么不用C和C ++这样做。 它不会消除头文件的需求吗?