【发布时间】:2021-12-13 18:07:30
【问题描述】:
我正在使用 grap。 我的图是这样的结构
typedef struct{
int order; // number of node
int **mat; // matrix graphe
}graphe;
我正在做学校项目,我需要构建一组从 0 到 N 的二进制数(图中的顺序在哪里)
实际上我这样做了,它正在工作。当我打印 final 变量时,它会显示二进制数的所有declinaison(000、001、010、011 等...)
char** construireSousEnsemble(graphe g){
int size = pow(2, g.order);
char** D = (char**)malloc(sizeof(char*)*g.order-1);
for (int i = 0; i < size; i++){
D[i] = (char*)malloc(g.order-1);
char buffer[g.order-1];
char tmp[g.order-1];
char final[g.order-1];
for (int j = g.order-1; j >= 0; j--){
int bin = (i >> j)&1;
sprintf(buffer, "%d", bin);
snprintf(tmp, sizeof(tmp), "%s", buffer);
strcat(final, tmp);
if (j == 0){
strcpy(D[i], final);
//printf("%s\n", D[i]);
//printf("%d | %s\n", i, D[i]);
memset(final, 0, sizeof(final)); // reset the zone
}
}
//printf("\n");
}
return D;
}
但是在主函数中,当我这样调用函数时:
char** zones = construireSousEnsemble(g);
所以我有点迷路了。 此示例适用于 3 节点图。如果我有 4 个节点,奇怪的符号会增加,我不会有 0001 或 0010 等,与 5 或 6 个节点相同。
所以我的问题是,为什么会这样?
顺便说一句,我对 C 不太适应,所以也许我犯了一些错误。
谢谢大家:)
【问题讨论】:
-
-fsanitize=addr对调试这些问题很有帮助 -
D 的大小已关闭。应该是 n^2-1。您使用 n-1。 //
D的每个元素的大小也是关闭的。应该是 n+1(因为 NUL)。你使用 n-1。 -
strcat(final, tmp);第一次循环没有初始化final的内容。 -
ikegami:什么是-fsanitize=addr?我该如何使用它?
-
可以传递给
gcc或clang的选项。 (使用@name否则人们不会收到通知。)
标签: c multidimensional-array graph char strcpy