gpt4 book ai didi

C:结构中的二维字符指针

转载 作者:太空宇宙 更新时间:2023-11-04 08:18:22 26 4
gpt4 key购买 nike

我想在结构的二维数组中写入和打印一些字符串。该结构称为 Router,位于头文件中,二维数组在该结构中定义,称为 **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;
}

最佳答案

首先:Don't cast the result of malloc .

假设您想在二维数组中存储 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 数组(或显式 memset)时使用 calloc 而不是 malloc 来避免这种情况,然后在您的代码中添加 NULL 检查viewTable 函数。

最后,如果您调用 updateTable 时使用的 char* 指针不是字符串文字,或者它们尚未分配到堆上,您可能会遇到更多问题。 ..

关于C:结构中的二维字符指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34501350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com