Tag: 初始化

重新初始化arrays是否会产生段错误?

我正在对输入文件格式(u,v,weight)的大量图形数据运行宽度优先搜索和贝尔曼福特算法。 我在广度优先搜索中初始化,所有顶点都应标记为0以供未访问。 后来在程序中,因为我每次添加边缘后都会调用BFS,而不是在程序结束时(这是关于Bellman ford和BFS的研究项目的一部分,即使它没有多大意义)我将顶点数组重新初始化为unvisited。 但是,当我重新初始化顶点数组时运行更大的集合时,我遇到了分段错误。 我假设有更大的集合,因为我有一些较小的测试数据集,从8个顶点到10,然后在100和更大,它失败了。 以下是我在程序开始时初始化的方法: for(i=0;i<numberVertices;i++) { vertexArray[i].v = i+1; vertexArray[i].adj = NULL; vertexArray[i].marked = 0; if(i==0) { vertexArray[i].weight = 0; } else{ vertexArray[i].weight = 10000; } } 以下是我在BFS结束后直接到达文件末尾时,在while循环结束时重新初始化的方式: BFS(q, u) for(i=0;i<numberVertices;i++) { vertexArray[i].marked = 0; } 就像我说它似乎适用于较小的数据集,但我不明白为什么当我重新初始化它似乎是错误的。 请让我知道你的想法和建议! Valgrind输出示例案例: ==6634== Memcheck, a memory error detector ==6634== Copyright (C) 2002-2010, and GNU GPL’d, […]

struct变量初始化

我尝试初始化struct变量如下: struct Abc{ char str[10]; }; int main(){ struct Abc s1; s1.str=”Hello”; //error } 我可以理解这种行为,因为它与…相同 char str[10]; str=”Hello”; // incompatible types 但请看下面的初始化 struct Abc s1={“Hello”}; //This is fine struct Abc s2={.str=”Hello”}; //This is also fine 我记得在gradle时,我读了很多教科书,上面说这两个初始化都是同一个东西(即使用{}表示法初始化结构变量,并明确地使用(。)运算符是相同的事情)。 但上面的讨论certificate它们并不相同。 我的问题是这些初始化之间究竟有什么区别?

对堆上结构使用struct初始化语法

我有这个简单的结构,我想在堆上初始化并作为函数中的指针返回。 struct entry { const char* const key; // We don’t want the key modified in any way const void* data; // But the pointer to data can change struct entry* next; }; 有一个问题,我不能calloc它并逐个初始化成员因为key是一个const指针。 我找到了一个有效的语法: struct entry* entry = calloc(1, sizeof(struct entry)); *entry = (struct entry) { .key = key, .data = data, .next = […]

C结构初始化与变量

我遇到了C89之后似乎没有通过任何C标准解决的问题,除非提到结构初始化限制已被解除。 但是,我使用Open Watcom IDE(用于调试)遇到错误,其中编译器声明初始化程序必须是常量表达式。 这是正在发生的事情的要点。 typedef struct{ short x; short y; } POINT; void foo( short x, short y ) { POINT here = { x, y }; /* <– This is generating the error for the compiler */ /* … */ } 任何想法为什么,或什么标准不允许?

通过传递引用或返回它来初始化结构是否更好?

说我有以下内容: typedef struct { int x; int y; char a; char b; } myStruct; 通过将引用传递给空函数,或者通过从函数返回myStruct ,创建具有函数的新myStruct是更好的做法吗? void init(myStruct* s){ //some code } int main(){ myStruct s; init(&s); return 0; } VS myStruct init(){ myStruct r; //some code return r; } int main(){ myStruct s = init(); return 0; }

未提及的struct fields *总是*初始化为零(即结构在堆栈中时)?

来自实验(在Clang和GCC中,使用-O2和-O0) 似乎在以下代码中 typedef struct foo_s { int i; int j; } foo_t; int main(void) { foo_t foo = {.i = 42}; … foo.j自动为零。 是否由C99开始保证,还是编译器特定的实现细节? 注意:我甚至尝试将0xFF写入堆栈下方的无效内存,稍后给出了foo的地址。 更新:有几条评论声明这只是因为堆栈下方的内存恰好包含零。 以下代码确保不是这种情况,并且可能certificateGCC -O0正在归零内存。 -7和-6的偏移量取决于编译器。 他们需要在Clang中有所不同。 typedef struct foo_s { int i; int j; } foo_t; int main(void) { int r; int *badstack0 = &r – 7; int *badstack1 = &r […]

初始化结构中的数组值

我有一个结构,里面有几个数组。 这些数组的类型为unsigned char [4]。 我可以通过调用初始化每个元素 struct->array1[0] = (unsigned char) something; … struct->array1[3] = (unsigned char) something; 只是想知道是否有办法在一行中初始化所有4个值。 解决方案:我需要创建一个初始化所有值的临时数组,然后调用memset()将值复制到struct数组。

数组中未初始化元素的值是多少?

我有以下代码 int t[] = { [1] = 45, [2] = 33 }; 在这种情况下, t[0]的值是多少? 它会包含垃圾吗?

C99结构指定的初始化程序和其他值

我知道在C99中你可以使用成员名称初始化结构的成员,如下所示: struct myStruct { int i; char c; float f; }; 以下是有效的: struct myStruct m = {.f = 10.11, .i = 5, .c = ‘a’}; 还有人说未初始化的成员将被设置为0 。 所以 struct myStruct m = {.f = 10.11, .c = ‘a’}; 在这里i将被设置为0 但是,对于以下内容: struct myStruct m = {.f = 10.11, .c = ‘a’, 6}; i仍然初始化为0.如果我们进行这样的复合初始化是什么原因。

使用大括号初始化标量

在C和C ++中,可以使用大括号初始化数组和结构: int a[] = {2, 3, 5, 7}; entry e = {“answer”, 42}; 然而,在2007年的一次演讲中 ,Bjarne提到这种语法也适用于标量。 我尝试过这个: int i = {7}; 它确实有效! 允许使用大括号初始化标量的原理是什么? 注意:我特别不是在谈论C ++ 11统一初始化。 这是很好的旧C89和C ++ 98。