未对齐的内存访问是否总是导致总线错误?

根据Wikipedia页面Segmentation fault ,未对齐的内存访问可能导致总线错误。 本文提供了有关如何触发总线错误的示例。 在示例中,我们必须启用对齐检查以查看总线错误。 如果我们禁用这种对齐检查怎么办? 该程序似乎正常工作。 我有一个程序经常访问未对齐的内存,很少有人使用它,但没有人向我报告总线错误或其他奇怪的结果。 如果我们禁用对齐检查,未对齐内存的副作用是什么? 平台:我正在开发x86 / x86-64 。 我也通过在Mac上用“gcc -arch ppc”编译它来尝试我的程序,它运行正常。

如何找出cl.exe的内置宏

有谁知道我怎样才能找出cl.exe的内置/预定义宏? 例如,对于gcc,以下命令行将列出所有编译器的内置宏 gcc -dM -E – </dev/null 编辑:我对类似于gcc的方式感兴趣,就是“询问实际的编译器”。 谢谢

分配结构字段时,“错误:赋值给表达式,数组类型错误”(C)

我是初学C程序员,昨天我学习了C结构的使用以及这些结构可能应用于特定问题的解决方案。 然而,当我尝试使用我的C IDE(Codeblocks 16.01)来学习C编程的这个方面时,我遇到了一个奇怪的问题。 代码如下: #include #define N 30 typedef struct{ char name[N]; char surname[N]; int age; } data; int main() { data s1; s1.name=”Paolo”; s1.surname = “Rossi”; s1.age = 19; getchar(); return 0; } 在编译期间,编译器(Windows下的GCC 4.9.3-1)向我报告了一个错误 “错误:赋值给表达式,数组类型错误” 在指导上 s1.name=”Paolo” s1.surname=”Rossi” 如果我这样做的话 data s1 = {“Paolo”, “Rossi”, 19}; 有用。 我究竟做错了什么?

这个memcpy实现中缺少什么/次优?

我对编写memcpy()作为一种教育练习感兴趣。 我不会写一篇关于我做了什么和没想过的论文,但这里有一些人的实现 : __forceinline //因为通常Size已知,内联后编译器可以优化掉大部分无用代码void* myMemcpy(char* Dst, const char* Src, size_t Size) { void* start = Dst; for ( ; Size >= sizeof(__m256i); Size -= sizeof(__m256i) ) { __m256i ymm = _mm256_loadu_si256(((const __m256i* &)Src)++); _mm256_storeu_si256(((__m256i* &)Dst)++, ymm); } #define CPY_1B *((uint8_t * &)Dst)++ = *((const uint8_t * &)Src)++ #define CPY_2B *((uint16_t* &)Dst)++ = *((const uint16_t* […]

C中的指针与数组,非平凡差异

我以为我真的理解这一点,并重新阅读标准(ISO 9899:1990)只是证实了我明显错误的理解,所以现在我在这里问。 以下程序崩溃: #include #include typedef struct { int array[3]; } type1_t; typedef struct { int *ptr; } type2_t; type1_t my_test = { {1, 2, 3} }; int main(int argc, char *argv[]) { (void)argc; (void)argv; type1_t *type1_p = &my_test; type2_t *type2_p = (type2_t *) &my_test; printf(“offsetof(type1_t, array) = %lu\n”, offsetof(type1_t, array)); // 0 printf(“my_test.array[0] = […]

如何使用Visual Studio 2012编译Win XP?

好的,所以我在Windows 7 x64中使用Visual Studio 2012进行编程和编译。 我的应用程序在那里工作正常,但是当我尝试从Windows XP SP3虚拟机执行它时,我立刻得到“xxxx.exe不是一个有效的win32应用程序”。 正在使用静态链接编译应用程序,即使用/ MT。 我在targetver.exe中将_WIN32_WINNT设置为0x0501; 配置管理器设置为Win32,链接器高级选项中的目标计算机设置为MACHINEX86。 我的targetver.h看起来像这样: #include #define _WIN32_WINNT 0x0501 #define WINVER 0x0501 #define NTDDI_VERSION 0x0501 #include 我也尝试使用/ MD进行编译并安装.NET Framework,但这也没有用。 我很无能,我真的可以使用一些帮助,因为我需要让它适用于Windows XP。 提前致谢。

未指定,未定义和实现定义的行为WIKI for C

虽然SO上有很多关于这个主题的链接,但我认为有些东西缺失:用简单的语言明确解释未指定行为 (UsB), 未定义行为 (UB)和实现定义行为 (IDB)之间的区别)详细但容易解释任何用例和示例。 注意:为了在WIKI中实现紧凑性,我将UsB缩写为up,但是不要指望在其他地方使用它。 我知道这可能看起来与其他post(它更接近的是这个 ) 的重复 ,但在任何人将此标记为重复之前 ,请考虑我已经找到的所有材料的问题(我将要制作这个post中的社区WIKI): 太多分散的例子。 当然,例子并不坏,但有时人们无法找到一个很好地适应他手头问题的例子,因此它们可能会令人困惑(特别是对于新手)。 示例通常只是代码,但解释很少。 在这些微妙的问题上,特别是(相对)新手,更自上而下的方法可能更好:首先是一个清晰,简单的解释与抽象(但不是法律)的描述, 然后是一些简单的例子,解释为什么他们触发一些行为 。 有些post经常混合使用C和C ++示例。 C和C ++有时与他们认为的UsB,UB和IDB不一致,所以一个例子可能会误导那些不熟悉这两种语言的人。 当给出UsB,UB和IDB的定义时,通常它是标准的简单引用,有时可能不清楚或难以为新手消化。 有时引用标准是不完整的。 许多post只引用了对手头问题有用的部分标准,这很好,但缺乏一般性。 此外,标准的引用通常没有任何解释(对初学者不利)。 由于我自己不是这个主题的超级专家,我将建立一个社区WIKI,以便任何有兴趣的人都可以贡献并改进答案。 为了不破坏我创建一个结构良好的初学友好的WIKI的目的,我希望海报在编辑WIKI时遵循一些简单的指导原则: 对您的用例进行分类。 尝试将您的示例/代码放在已存在的类别下(如果适用),否则创建一个新类别。 首先是简单的单词描述。 首先用简单的词语描述(当然,不要过于简单化 – 质量第一!)你想要做的例子或要点。 然后输入代码示例或引用。 引用标准参考。 不要发布各种标准的片段,但要提供明确的参考资料(例如C99 WG14 / N ……第1.4.7节,第……段), 并在可能的情况下发布相关资源的链接。 喜欢免费的在线资源。 如果你想引用书籍或非免费可用的资源(可能会提高WIKI的质量),但也尝试添加一些免费资源的链接。 这对ISO标准尤为重要。 欢迎您添加官方标准的链接,但也尝试添加等效链接以免费提供草稿。 请不要将参考链接替换为参考官方标准, 添加到它们 。 甚至某些大学的某些计算机科学系也没有ISO标准的副本,更不用说大多数程序员了! 除非确实需要,否则不要发布代码。 仅在仅使用普通英语的解释尴尬或不清楚时才发布代码。 尝试将代码示例限制为单行。 发布指向其他SO Q&A的链接。 不要发布C […]

通过指针传递二维数组

如何将m矩阵传递给foo()? 如果我不被允许更改代码或foo()的原型? void foo(float **pm) { int i,j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) printf("%f\n", pm[i][j]); } int main () { float m[4][4]; int i,j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) m[i][j] = i+j; foo(???m???); […]

返回void *的C ++ / C函数指针

我正在尝试调用一个带参数的函数, void(*)(void*, int, const char*) ,但我无法弄清楚如何将这些参数传递给函数。 例: void ptr(int); int function(int, int, void(*)(int)); 我试图像这样调用函数: function(20, 20, ptr(20)); 这可能吗?

在Linux上直接访问C程序没有FS的硬盘

我想直接从C程序访问整个硬盘。 它上面没有FS,永远不会是一个。 我只想打开/ dev / sda(例如)并在磁盘的块/扇区级别执行I / O. 我打算在Linux环境中编写一些用于学习C编程的程序(我知道C语言,Python,Perl和Java),但对Linux环境缺乏信心。 为了我的学习目的,我正在考虑使用kyoto-cabinet并将与计算的哈希相对应的值直接保存到硬盘的“块/扇区”中,将对:“哈希,块/扇区引用”记录到一个kyoto-cabinet哈希数据库文件。 我不知道使用标准CI / Ofunction是否可行,否则我不得不写一个“设备驱动程序”或类似的东西……