C:结构中的2d char指针

时间:2015-12-28 21:55:49

标签: c arrays pointers struct

我想在结构中的二维数组中编写和打印一些字符串。该结构称为路由器,它位于头文件中,2d数组在该结构中定义,它被称为** addTab。当我尝试使用viewTable函数打印一行数组时程序停止工作......为什么?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "router.h"
#define N 8
#define M 3
#define sizeMess 5

Router *createRouter(){
    Router *NewRouter=(Router*)malloc(sizeof(Router));
    int i;
    NewRouter->addTab=(char **) malloc(N*sizeof(char *));
    for(i=0;i<N;i++)
        NewRouter->addTab[i]=(char *) malloc(M*sizeof(char));
    return NewRouter;
}


void viewTable(Router *r, int a){
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            printf("raw\t col\t address\t value\t\n");
            printf("%d\t %d\t",i,j);
            printf("%p\t",&r->addTab[i][j]);
            printf("%s\t\n",r->addTab[i][j]);
        }
    }
}
void updateTable(Router *r, int conn, char *addr1, char *addr2){
    r->addTab[conn][1]=addr1;
    r->addTab[conn][2]=addr2;
}

3 个答案:

答案 0 :(得分:2)

首先关闭:Don't cast the result of malloc

假设您想在2D数组中存储char*指针(如问题标题所示),您需要在char ***结构中将其定义为Router,像这样:

typedef struct router {
    char ***addTab;
} Router;

接下来,您需要更改createRouter函数,以便它可以存储char*指针数组,而不是每个元素的单个字节,如下所示:

Router *createRouter(){
    Router *NewRouter=malloc(sizeof(Router));
    int i;
    NewRouter->addTab=malloc(N*sizeof(char **));
    for (i=0;i<N;i++)
        NewRouter->addTab[i]=malloc(M*sizeof(char *));
    return NewRouter;
}

我不确定您如何调用updateTable函数,但除非您实际用char*指针填充整个数组,否则viewTable函数也会调用Undefined Behavior函数因为printf语句将尝试访问未初始化的数据。您可以在分配2D数组(或显式calloc)时使用malloc而不是memset来避免这种情况,然后在viewTable函数中添加NULL检查。

最后,如果您使用不是字符串文字的updateTable指针调用char*,或者它们尚未在堆上分配,则可能还有其他问题......

答案 1 :(得分:0)

您的updateTable()无法正常工作。您在r->addTab[i][j]中分配了内存,然后为其指定了一个指针(r->addTab[conn][1]=addr1)。在viewTable中访问时,程序会尝试在addr1读取内存,但很可能无法读取内存,从而导致崩溃。

使用函数将给定字符串复制到r-&gt; addTab,例如像这样:

void router_tab_printf(Router *r, const int conn, const int i, const char *value) {
    sprintf(r->addTab[conn][i], "%s", value);
}    

这假设r->addTab[conn][i]足以容纳value

答案 2 :(得分:0)

您需要更改您的updateTable

void updateTable(Router *r, int conn, char *addr1, char *addr2){
strcpy(r->addTab[conn], addr1);
strcpy(r->addTab[conn+1 /*or something*/], addr2);
}