我想在结构中的二维数组中编写和打印一些字符串。该结构称为路由器,它位于头文件中,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;
}
答案 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);
}