我想在结构中的2d数组中写入和打印一些字符串。该结构称为路由器,它位于头文件中,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;
}发布于 2015-12-28 22:40:30
首先:不要投马洛的结果。
假设您想要在2D数组中存储char*指针(如问题的标题所示),则需要在Router结构中将其定义为char ***,如下所示:
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函数也将调用未定义行为,因为printf语句将尝试访问未初始化的数据。您可以在分配2D数组时使用calloc而不是malloc来避免这一点(或者显式地使用memset ),然后在viewTable函数中添加空检查。
最后,如果使用非字符串文本的char*指针调用char*,或者没有在堆中分配这些指针,则可能会有进一步的问题.
发布于 2015-12-28 22:09:36
您的updateTable()不像您预期的那样工作。您在r->addTab[i][j]中分配了内存,然后为它分配了一个指针(r->addTab[conn][1]=addr1)。在viewTable的访问中,程序尝试在addr1读取内存,但很可能无法读取它,从而崩溃。
使用函数将给定的字符串复制到r->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。
发布于 2015-12-29 00:18:37
你需要改变你的updateTable
void updateTable(Router *r, int conn, char *addr1, char *addr2){
strcpy(r->addTab[conn], addr1);
strcpy(r->addTab[conn+1 /*or something*/], addr2);
}https://stackoverflow.com/questions/34501350
复制相似问题