首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C:结构中的2d字符指针

C:结构中的2d字符指针
EN

Stack Overflow用户
提问于 2015-12-28 21:55:48
回答 3查看 107关注 0票数 0

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

代码语言:javascript
运行
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-28 22:40:30

首先:不要投马洛的结果

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

代码语言:javascript
运行
复制
typedef struct router {
    char ***addTab;
} Router;

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

代码语言:javascript
运行
复制
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*,或者没有在堆中分配这些指针,则可能会有进一步的问题.

票数 2
EN

Stack Overflow用户

发布于 2015-12-28 22:09:36

您的updateTable()不像您预期的那样工作。您在r->addTab[i][j]中分配了内存,然后为它分配了一个指针(r->addTab[conn][1]=addr1)。在viewTable的访问中,程序尝试在addr1读取内存,但很可能无法读取它,从而崩溃。

使用函数将给定的字符串复制到r->addTab,例如:

代码语言:javascript
运行
复制
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

票数 0
EN

Stack Overflow用户

发布于 2015-12-29 00:18:37

你需要改变你的updateTable

代码语言:javascript
运行
复制
void updateTable(Router *r, int conn, char *addr1, char *addr2){
strcpy(r->addTab[conn], addr1);
strcpy(r->addTab[conn+1 /*or something*/], addr2);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34501350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档