【问题标题】:Problems getting to work a C multidimensional char array使用 C 多维字符数组时遇到问题
【发布时间】:2020-04-01 16:55:27
【问题描述】:

我将不胜感激有关以下代码的一些指导,以使其正常工作。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define charLength  5
#define bytesLength charLength*sizeof(char)
int n;
char**  T=0;
void fillT(int n){
    char* __T[n];
    for(int i=0; i<n; i++) {
        __T[i] = (char*)malloc(bytesLength);
        scanf("%s",__T[i]);
    }
    T = __T;
}
void foo(){
    n = 3;
    fillT(n);
}
int main(){
    foo();
    for(int i=0; i<n; i++){  //works OK
        printf("%d %s\n",i,T[i]);
    }
    for(int i=0; i<n; i++){  //doesn't work!!!, Why???
        printf("%s\n",T[i]);
    }
}

我需要让最后一个 for 循环工作,但由于某种我无法理解的原因,我做不到。

This 是当前输出。

【问题讨论】:

  • fillT() 返回时,您认为char* __T[n]; 会发生什么?
  • “不起作用”是什么意思?共享错误消息或预期输出与错误输出。此外,这似乎是一个调试作业。
  • 我添加了一个屏幕截图;预期的输出是第一个 for 循环,错误的 putput 是末尾的两个空行;事实上,这是一个 2K 线项目的小型模型,出于某种原因我坚持了下来。非常感谢您的回复。
  • @practicante 如果您不在您的 cmets 中标记我,我将不会收到通知。我不知道你在说什么项目,但无论如何我都会尽力帮助你。让我检查一下。

标签: c multidimensional-array char


【解决方案1】:

问题:

char* __T[n];

如果您的代码中的所有其他字符串项都是动态的,那么这是一个孤独者。这个变量(字符串数组)是堆栈分配的。所以,在函数fillT 终止后它就会死掉。但是你在退出函数之前将它分配给一个全局变量,那么有什么问题呢?这就产生了一个大问题:Undefined Behaviour

全局char** T 指向已经被破坏的东西。试图在两个循环内访问它是未定义的行为。当我运行代码时,两个循环都给出了错误的输出。我想知道你是如何在第一个循环中得到正确的输出的,也许你很幸运,因为未定义的行为可能意味着任何事情。

解决方案:

使分配的堆栈__T 成为堆分配的变量,这将使它一直有效,直到您的程序终止或您free 它。

char* __T[n]; 替换为

char** __T = malloc(n * sizeof(char*));

【讨论】:

  • 首先,非常感谢您花时间和耐心尝试我的代码,我会尝试您的建议。
猜你喜欢
  • 1970-01-01
  • 2018-05-02
  • 2016-06-25
  • 2021-02-08
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多