【问题标题】:I have a problem when i'm printing char** array我在打印 char** 数组时遇到问题
【发布时间】: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);

但是当我使用 zones 打印内容时,我有这个:

所以我有点迷路了。 此示例适用于 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?我该如何使用它?
  • 可以传递给gccclang 的选项。 (使用@name 否则人们不会收到通知。)

标签: c multidimensional-array graph char strcpy


【解决方案1】:

这是解决方案(如果将来发布)

char ** construireSousEnsemble(graphe g){
    int size = pow(2, g.order);
    char **D = (char **) malloc (sizeof (char *) * size);

    char buffer[g.order];
    char final[g.order];

    for (int i = 0; i < size; i++) {
        D[i] = (char *)malloc(g.order + 1);
        final[0] = 0;
        for (int j = g.order - 1; j >= 0; j--) {
            int bin = (i >> j) & 1;
            sprintf (buffer, "%d", bin);
            strcat (final, buffer);
        }
        strcpy (D[i], final);
    }
    return D;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2021-02-08
  • 2016-06-25
  • 1970-01-01
  • 2018-06-12
相关资源
最近更新 更多