gpt4 book ai didi

c - 在 main 外部和 main 内部分配全局结构变量

转载 作者:行者123 更新时间:2023-11-30 19:29:22 27 4
gpt4 key购买 nike

问题是当我将代码分成不同的函数时,就会发生这种情况

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

//------Options -- change only true / false to trigger the function
bool hard_trace = false;
bool trace = true;
/*-------------------*/

//---------Defines----------
#define MAXSIZE 100 // maximum size of the characters in txt file to be buffed
/*----------------------*/

//---------Structs-----------
struct Matrix
{
char *A[10];
int depth;
};
/*--------------------------*/
//-----Variable----------
//-- global
char *B[3];
//- struct
struct Matrix matrixs ; // create new global struct
//-
//--
/*-----------------------*/

int convertCharToNumber(char target[1])
{
int numbered = target[0] - 48;
return numbered;
}

int generateDataFromFile(){
//-- temped
int currentLine = 1;
int currentRow = 0;
//-----------------
FILE *fp;
char line[MAXSIZE];

fp = fopen("test.txt", "r");
if (fp == NULL)
{
fprintf(stderr, "%s\n", "Error reading from file");
exit(EXIT_FAILURE);
}

while (fgets(line, MAXSIZE, fp) != NULL)
{
if(hard_trace){ // if it was enabled
printf("current line : %d and length : %d\n", currentLine, strlen(line));
}
if (line[strlen(line) - 1] == '\n') // cutout the \n to make the txt easy to use
{
line[strlen(line) - 1] = '\0';
}
//appileToStruct(line,currentRow);
matrixs.A[currentRow] = line;
//if(trace) printf("%s\n", line);
currentLine++; currentRow++;
}
if(trace) printf("Total line receive from txt file : %d\n" , currentLine-1); //if it was enabled
fclose(fp);

// ----------- assign the var
matrixs.depth = currentLine - 1;
//----------------------------

//return 1;
}

void main(){
generateDataFromFile();
printf("Total : %d TXT : [%s]", strlen(matrixs.A[0]), matrixs.A[0]);
}

以及此处的输出

从 txt 文件接收的总行数:3

总计:10 TXT:[]

.

但是当我像这样直接将代码放在main中时就可以了

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

//------Options -- change only true / false to trigger the function
bool hard_trace = false;
bool trace = true;
/*-------------------*/

//---------Defines----------
#define MAXSIZE 100 // maximum size of the characters in txt file to be buffed
/*----------------------*/

//---------Structs-----------
struct Matrix
{
char *A[10];
int depth;
};
/*--------------------------*/
//-----Variable----------
//-- global
char *B[3];
//- struct
struct Matrix matrixs; // create new global struct
//-
//--
/*-----------------------*/

int convertCharToNumber(char target[1])
{
int numbered = target[0] - 48;
return numbered;
}

int main()
{
//-- temped
int currentLine = 1;
int currentRow = 0;
//-----------------
FILE *fp;
char line[MAXSIZE];

fp = fopen("test.txt", "r");
if (fp == NULL)
{
fprintf(stderr, "%s\n", "Error reading from file");
exit(EXIT_FAILURE);
}

while (fgets(line, MAXSIZE, fp) != NULL)
{
if (hard_trace)
{ // if it was enabled
printf("current line : %d and length : %d\n", currentLine, strlen(line));
}
if (line[strlen(line) - 1] == '\n') // cutout the \n to make the txt easy to use
{
line[strlen(line) - 1] = '\0';
}
//appileToStruct(line,currentRow);
matrixs.A[currentRow] = line;
//if(trace) printf("%s\n", line);
currentLine++;
currentRow++;
}
if (trace)
printf("Total line recieve from txt file : %d\n", currentLine - 1); //if it was enabled
fclose(fp);

// ----------- assign the var
matrixs.depth = currentLine - 1;
//----------------------------

printf("Total : %d TXT : [%s]", strlen(matrixs.A[0]), matrixs.A[0]);
}

输出

从 txt 文件接收的总行数:3

总计:10 TXT:[0000111100]

你能向我解释一下为什么第一个代码不起作用吗?我的意思是为什么 printf 中的 %s 没有为我显示输出以及如何让第一个代码起作用

最佳答案

当你这样做时:

matrixs.A[currentRow] = line;

您将本地数组 line 的地址分配给 matrixs.A 的一个元素。对于第二个程序,它会打印一个有效值,因为 line 仍在范围内。但在第一个程序中,line 超出了范围,因此 matrixs.A[0] 指向无效内存。取消引用此指针会调用 undefined behavior .

此外,在第二个程序中,您可能会注意到 matrixs.A 的每个元素都包含您读取的最后一个值。这又是因为您在每个行中存储了的地址。

您应该复制您读取的字符串并保存指向新字符串的指针。这样 1) 您不会存储局部变量的地址,2) 您不会在 matrixs.A 的每个元素中存储相同的地址。

matrixs.A[currentRow] = strdup(line);

关于c - 在 main 外部和 main 内部分配全局结构变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52898062/

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