gpt4 book ai didi

c - 当我在编译时只知道一维时在 C 中使用二维数组全局变量

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

我的情况很奇怪。我有一个全局二维字符数组(表示一个字符串数组)。这些字符串的长度不超过 28,包括终止字符,所以我只想使用一个二维数组,其中一个维度设置为 28。另一个维度是在编译时确定的,但我的程序会计算它有多少个插槽在分配数组之前需要。

我正在尝试像这样声明数组(全局):

char** dictionary;

然后在我的一个函数中,我需要分配它。一旦我尝试使用 dictionary[0][0] 或其他东西访问它们,这两个就会给我错误的访问错误:

dictionary = malloc(sizeof(char)*(28)*numberWords); //numberWords ends up being around 60000
//separately:
char newDict[numberWords][28];
dictionary = newDict;

是的,我对 C 有点陌生。希望我的学校教我它而不是 Java。

最佳答案

char newDict[numberWords][28];
dictionary = newDict;

首先这部分是错误的,newDict 是一个数组,它分配在一段内存中,而字典是一个指向指针的指针,它分散在堆的不同部分,你无法访问因为字典正在寻找一个指针指向一个指针,而 newdict 不包含指针,请阅读数组和指针,尽管它们看起来以相似的方式工作,但它们是不同的

我看到您想使用数组表示法,因此您分配了 dictionaty = newdict(这是错误的)

简单的方法是

char ** dictionary;
dictionary = (char **)malloc(sizeof(char *)*NUMBER_OF_WORDS)

for(int i =0;i<NUM_WORDS,i++)
{
dictionary[i] = (char *)malloc(sizeof(char)*28);
}

now you can access each word like this
dictionary[word_number][the letter];

//so in your code you said char ** dictionaty, lets go through this, dictionary is a
pointer to another pointer that points to a char. look at my code, dictionary is a
pointer, that points to another pointer that eventuall points to a char.

为什么会这样?

数组符号像这样 a[x] = *(a+x) ,换句话说转到数组 a,添加 x 并取该内存位置中的数字方括号称为语法糖,只是为了我们的生活更轻松,真正发生的是 *(a+x)。

对于二维数组 a[x][y] = * ( *(a+x) + y) 这就是说转到指针 a,将 x 添加到指针,获取内存中的内容 *(a +x) 然后将 y 添加到该内存中并取出指向 * (* (a+x) + y) 的任何内容

请注意,当我说将 x 添加到指针时,这取决于数组的内容,比如你是否有一个整数数组,因为一个整数是 4 个字节,假设 x 是 1,

int a[10]
a[1] = *(a+1) (the compiler actually adds 4 bytes to the address although we
said 1 obviously since an int is 4 bytes, this
is pointer arithmetic you should read up on it. this makes things much easier.

内存中真正发生的是将 4 个字节添加到 a+1 的地址,编译器会为我们处理这个,所以这使事情变得容易得多,如果你是一个字符,那么说 a [1] = *(a+1),

回到你的问题。

dictionary[0][0] 会给你第一个单词的第一个字母,因为你的字符串是 null 终止的,所以你可以得到整个字符串,比如带有 %s 的 printf。

关于c - 当我在编译时只知道一维时在 C 中使用二维数组全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20833769/

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