对指针感到困惑?

时间:2011-05-21 19:05:17

标签: c

我正在尝试将变量写入变量,我无法弄清楚如何做到这一点。

这不起作用 - 搞砸内存,但没有保护错误:

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。 listchar**

4 个答案:

答案 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];

或动态分配。