Tag: 初始化

在C中初始化一个char指针。为什么认为危险?

可能重复: C中的char s []和char * s有什么区别? 我初始化一个char指针: char *a=”test”; 我在某些地方读到这被认为是只读的 ,这很危险。 这是否意味着”test”没有在堆中分配空间? 这是否意味着字符串“test”可以在程序中稍后写入? —扩大我的问题— 如果我已经初始化a如上所述,然后我做了一堆其他的初始化,如: int b=20; char c[]=”blahblahblah”; 内存中的“测试”是否会被“20”或“blah”覆盖? 或者这种情况没有根据?

如何使用avr-gcc在C / C ++中执行预主要初始化?

为了确保一些初始化代码在main之前运行(使用Arduino / avr-gcc),我有如下代码: class Init { public: Init() { initialize(); } }; Init init; 理想情况下,我希望能够简单地写: initialize(); 但这不编译…… 是否有一种不那么冗长的方式来达到同样的效果? 注意:代码是Arduino草图的一部分,因此mainfunction是自动生成的,不能修改(例如在任何其他代码之前调用initialize )。 更新:理想情况下,初始化将在setup函数中执行,但在这种情况下,还有其他代码,具体取决于它在main之前发生。

关于C中数组初始化的困惑

在C语言中,如果初始化一个这样的数组: int a[5] = {1,2}; 那么未明确初始化的数组的所有元素将用零隐式初始化。 但是,如果我初始化这样的数组: int a[5]={a[2]=1}; printf(“%d %d %d %d %d\n”, a[0], a[1],a[2], a[3], a[4]); 输出: 1 0 1 0 0 我不明白,为什么a[0]打印1而不是0 ? 是不确定的行为? 注意:这个问题在接受采访时被问到。

C ++中各个元素的静态数组初始化

以下代码适用于GCC的C编译器,但不适用于C ++编译器。 是否有“快捷方式”在C ++中实现相同的结果? int array[10] = { [1] = 1, [2] = 2, [9] = 9 }; 编辑:嗯,我发现了这一点,澄清了一切。 http://eli.thegreenplace.net/2011/02/15/array-initialization-with-enum-indices-in-c-but-not-c/

由`malloc()`分配的内存有哪些内容?

在使用malloc()分配内存空间后,我很清楚指针究竟是什么? 该联机帮助页告诉我calloc()用零初始化分配的内存空间。 malloc()函数分配大小字节并返回指向已分配内存的指针。 内存未初始化 。 如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值。 和 calloc()函数为每个大小为字节的nmemb元素数组分配内存,并返回指向已分配内存的指针。 内存设置为零 。 如果nmemb或size为0,则calloc()返回NULL或一个以后可以成功传递给free()的唯一指针值。 我在C中为C(haha)创建了一个非常简短的示例程序: int main() { char *dynamic_chars; unsigned amount; printf(“how much bytes you want to allocate?\n”); scanf(“%d”, &amount); dynamic_chars = (char*)malloc(amount*sizeof(char)); printf(“allocated:\n%s\n”, dynamic_chars); free(dynamic_chars); return 0; } 但是,在执行此代码时,它只输出任何内容。 如果我初始化内存我自己,例如使用循环使用0xFFFF初始化每个字节,那么程序会向我显示我期望的内容。 内存空间实际存在,因为我不会收到错误声称我正在尝试访问未初始化的变量。 由于内存空间通常不会被删除但被标记为可重写,我想知道通过执行我的程序,我是否应该能够看到以前使用过的随机内存字节? 但我什么都看不到,所以我对malloc()工作原理感到困惑。 EDIT1 关于malloc()或者一般内存使用的另一件事,我的程序很有趣:如果我使用calloc()来分配内存,我可以通过监视来跟踪程序的实际内存使用情况。 例如,如果我告诉我的程序,为每个calloc()分配1.000.000.000字节的内存,我将在我的系统监视器中看到以下内容: <img src="http://sofzh.miximages.com/c/sQMHq.png" alt="使用 calloc()时的内存消耗”> 你可以想象,当使用malloc() ,我什么也看不见。 我明白,仅仅通过分配内存,我当时并没有真正使用它,但我仍然感到困惑的是为什么我的操作系统(unix衍生物)不会将其识别为使用它。 因为malloc()就像calloc()将物理地址返回到我没有得到的内存位置,这个内存区域似乎实际上并没有被操作系统保留。 那么我可以在系统监视器中看到它吗? 如果我想将此作为一个新问题发布,请告诉我。 […]

如何重置函数内的静态变量

有没有办法重置函数中声明为static的变量? 目标是确保不使用来自不相关调用的延迟值调用该函数。 例如,我有一个矩arrays的函数opearting。 int foo(matrix *A, int colnum, int rownum){ static int whichColumn; static int *v; //vector of length A->nrows if (column != whichColumn){ memset(v,0,size); whichColumn = which; } //do other things } 该函数被调用n次,每列一次。 这是“重新设置”静态变量的正确方法吗? 是否有其他一般的万无一失的重置静态变量的方法? 例如,我想确保如果使用可能具有不同维度的新矩阵进行调用,则向量v被resize并归零等。似乎最简单的方法是使用NULL指针调用该函数: int foo(matrix *A, int colnum, int rownum){ static int whichColumn; static int *v; //vector of length A->nrows if […]

初始化变量并在声明后立即赋值给它是否有区别?

假设一个纯粹的非优化编译器,在初始化变量并在声明后为其赋值时,机器代码是否存在差异? 初始化方法 : int x = 2; 作业方式 : int x; x = 2; 我使用GCC输出为这两种不同方法生成的程序集,并且两者都产生了一条机器指令: movl $2, 12(%esp) 该指令只是将x变量保存的内存设置为值2 。 GCC可能正在优化这一点,因为它可以识别操作的最终结果; 但我认为这是解释这两个版本的唯一方法。 我的理由是两个版本都做同样的事情:将内存的一部分设置为特定值。 那么,如果生成的机器代码相同,那么为什么通常会在术语“ 初始化 ”和“ 赋值 ”之间进行区分? 术语“ 初始化 ”是否纯粹用于区分具有特定值的变量,这些变量具有在内存中留下任何垃圾值的那些(非初始化)变量?

为什么初始化一个全局变量,函数的返回值在声明时失败,但在文件范围内工作正常?

一个80k声誉贡献者R ..告诉我,我们不能用函数的返回值初始化全局变量,因为它不被认为是常量,全局变量必须用常量初始化。并且对他的话来说,我是真的按预期得到此程序的以下错误 – initializer element is not a constant是程序: #include int foo(); int gvar=foo(); //ERROR int main() { printf(“%d”,gvar); } int foo() { return 8; } 但在这种情况下,我只是不明白为什么上面的程序的后续更改版本根本没有显示任何错误并且工作正常。在第二个程序中,我使用相同函数foo()的返回值初始化相同的全局变量foo() 。你能告诉我这种结果变化的严格技术原因是什么?为什么用函数的返回值初始化全局变量会导致错误,但同样的返回值初始化工作正常从一个函数? #include int foo(); int gvar; int main() { gvar=foo(); printf(“%d”,gvar); } int foo() { return 8; } 输出 8

C数组的范围初始化

这个代码在哪里工作的非常简单的问题? static void *gostruct[] = { [0 … 255] = &&l_bad, [‘\t’] = &&l_loop, [‘ ‘] = &&l_loop, [‘\r’] = &&l_loop, [‘\n’] = &&l_loop, [‘”‘] = &&l_qup, [‘:’] = &&l_loop,[‘,’] = &&l_loop, [‘[‘] = &&l_up, [‘]’] = &&l_down, // tracking [] and {} individually would allow fuller validation but is really messy [‘{‘] = &&l_up, […]

对于未设置的值,使用IEEE754浮点NaN是一个好主意吗?

对于非数学原因未定义的值,使用IEEE754浮点NaN(非数字)是一个好主意吗? 在我们的情况下,它们尚未设置,因为尚未从其他设备接收到值。 上下文是使用IEC1131 REAL32值的嵌入式系统。 编辑:编程语言是C,所以我们很可能使用来自C99的NAN和isnanf(x)。 虽然我们可能需要一些额外的扭曲来将这些扭曲到我们的操作系统兼容性层中。 编程语言中的默认设置似乎是初始化具有正零的浮点变量,其内部表示全为零。 这对我们来说是不可用的,因为0在有效值的范围内。 使用NaN似乎是一个干净的解决方案,但也许它比它的价值更麻烦,我们应该选择其他一些价值?