我正在尝试将变量写入变量,我无法弄清楚如何做到这一点。
这不起作用 - 搞砸内存,但没有保护错误:
for (int i = 0; i < 20; i++) {
list[i] = 'a';
}
与此相同 - 记忆被搞砸了:
for (int i = 0; i < 20; i++) {
*(((int*)(list))+i) = 'a';
}
//I don't think this is a string issues as this doesn't help:
//*(((int*)(list))+20) = '\0';
这会导致总线错误:
for (int i = 0; i < 20; i++) {
*list[i] = 'a';
}
这可以按照需要运行:
*list = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
我做错了什么?
P.S。 list
是char**
。
答案 0 :(得分:2)
在C中,指针可用于表示数组,单个字符串是char
的数组,换句话说,是char *
。这意味着char **
是一个字符串数组。因此,如果您想将字符放入第一个字符串(假设已经为其分配了内存),则应在第一个循环中使用list[0][i] = 'a';
- 即将'a'
置于i
的位置} 0
字符串。
解释char **
(我怀疑是你应该使用的那个)的另一种方式是它是一个指针指向一个{{1的数组的指针}}。在这种情况下,您可以使用“外部”指针来修改内部指针指向的内容;这可以用来先分配字符串然后写入它:
char
在内存中,这看起来像这样:
*list = malloc(21); // Allocate 21 bytes and make the pointer that 'list' points to refer to that memory
for (int i = 0; i < 20; i++) {
(*list)[i] = 'a';
}
(*list)[20] = '\0'; // Also, you need the null terminator at the end of the string
答案 1 :(得分:1)
由于您需要一个字节数组,因此char**
是错误的 - 这是指向char
指针的指针。您希望char*
表示数组,但如果它是固定长度,我会将其声明为char list[20]
。
好像你想写这样的东西:
char list[20];
for (int i = 0; i < 20; i++) {
list[i] = 'a';
}
或者如果你想要堆分配使用
char *list = malloc(20);
由于我们沦为猜测,我认为你的意思是说*list
是一个字节数组。在这种情况下,代码就是这样:
char **list = get_list_from_somewhere();
*list = malloc(20);
for (int i = 0; i < 20; i++) {
*list[i] = 'a';
}
答案 2 :(得分:1)
char** list
不是'字节数组'是指向指向char的指针的'指针',您可以将其视为'char列表列表'。此外,如果您以这种方式定义它,您需要malloc足够的内存来保存数据。
当你写:
list[i] = 'a';
它弄乱了内存,因为你在指定的位置放置一个char'a'来保存指针。实际上在大多数编译器中,字符文字都是int类型,因此实际存储一个int形式的'a'作为指向内存位置的指针,这可能导致各种内存损坏。
如果您希望'list'在堆栈上,请将其定义为:
char list[20]
如果您希望'list'在堆中,请将其定义为:
char* list;
list = malloc(sizeof(char) * 20);
在任何一种情况下都将其视为:
list[i]
另外,假设int的大小等于指针的大小是不安全的,就像你在第二个例子中所做的那样。至少我认为那是你想要做的。
此外,如果您从数据流或某种类型的东西中存储原始字节,您可能应该使用'unsigned char'而不是'char',为了更安全,请使用'int8_t',因为您无法始终保证'char'是8位,虽然它在大多数平台上。
答案 3 :(得分:0)
您是如何初始化list
的?
char** list;
在这种情况下不起作用你必须有像
这样的东西char* list[20];
或动态分配。