gpt4 book ai didi

c - 读取数组时发生访问冲突

转载 作者:行者123 更新时间:2023-11-30 18:31:46 24 4
gpt4 key购买 nike

我正在尝试打印结构数组并收到访问冲突。不知道如何解决这个问题。 i、j、k 在中断处均为 0。如有任何帮助,我们将不胜感激。

更新:重新表述问题,访问结构内数据的正确方法是什么?另外qwr的答案看起来很有希望,稍后我将有时间测试,谢谢。

my struct printing array of structs

最佳答案

关于访问冲突:

Access Violation is generally an attempt to access memory that the CPU cannot physically address.

常见原因:

Dereferencing NULL pointers . (THIS IS YOUR CASE see picture). You want to access to 0x000(NULL) location

Attempting to access memory the program does not have rights to (such as kernel structures in process context)

Attempting to access a nonexistent memory address (outside process's address space)

Attempting to write read-only memory (such as code segment)

更多:more here in wikipedia

您应该如何分配(使用您的结构):

首先你应该分配内存;并且不要忘记你也应该编写它的自由函数

简单的分配是这样的:

   //instead I advice PCurrentData notation 
CurrentData AllCurrentData=malloc(NumProduct* sizeof *CurrentData);
//memset so we can then check it with null
memset(AllCurrentData,0,NumProduct* sizeof *CurrentData);
int i,y;
for(i=0;i<NumProduct;i++){
//Noncontiguous allocation.Suits to string allocation,cause string lens differs
AllCurrentData[i].data=malloc(COLUMNS*sizeof(char**));
memset(AllCurrentData[i].data,0,COLUMNS*sizeof(char**));
for(j=0;j<COLUMNS;j++){
//this is just example
//probably you want to allocate null terminating string
int size=strlen(your_null_terminating_string)+1;//+1 for adding null,too
AllCurrentData[i].data[j]=malloc(size*sizeof(char));
memcpy(AllCurrentData[i].data[j],your_null_terminating_string,size);

}

}

此外,您的代码中还有什么问题以及正确的方法

另外你做错了。查看您的结构,您持有 char**。但是您尝试使用 2D [][] 数组访问它。 为什么我们不能?因为无法保证 char** 对连续分配的引用,或者仅通过手动完成,编译器可以使用 [][]< 访问它的方式/强>。另外,对于 char** 来说,大部分分配都是以非连续方式完成的。因为字符串长度不同

所以请注意这些:

char** 不等于二维数组char v[][]数组。因此,使用 AllCurrentData[i].data[j][k] 来处理 char**错误

只有char*可以被同等地视为一维char v[]数组。 char[] 衰减为 char*

所以访问应该这样完成:

#define NULL 0
if(AllCurrentData[i]!=NULL && AllCurrentData[i].data[j]!=NULL){
char* str=AllCurrentData[i].data[j];
if(str!=NULL)
while (str[k]!='\0'){
printf("%c ",str[k]);++k;
}
}
/*or
while (*str){
printf("%c ",*str);++str;
} */
/*but actualy you can print null terminating string directly
(assuming you wanted this)
if(str!=NULL)
printf("%s",str);
*/

more to learn about arrays and pointers

关于c - 读取数组时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665504/

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