2011-05-21 119 views
2

我想写一个响应到一个变量,我不知道该怎么做。困惑指针?

这不起作用 - 螺丝内存,但没有保护的错误:

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

+1

'char **'不是一个字节序列,它是一个指向'char'的指针。你有没有分配任何内存? – 2011-05-21 19:08:02

+0

你为这个** list **变量分配了内存,对吗? – 2011-05-21 19:10:38

+0

我如何分配内存,使其像'* list =“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”;'做到这一点? – 2011-05-21 19:12:30

回答

2

在C中,指针可以用来表示一个数组,而单个字符串是一个数组char,或换句话说,一个char *。这意味着char **是一个字符串数组。因此,如果您想将字符放入第一个字符串(假设已将内存分配给它),则应在第一个循环中使用list[0][i] = 'a'; - 即将'a'放入0字符串的位置i

另一种解释char **(我怀疑是你应该使用的那个)的方法是它是一个指针,指向一个指向数组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 

在存储器中,这是这样的:

list ---> (another pointer) ---> |a|a|a|a|a|a|...|a|a|\0| 
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'; 
} 
+0

我不行。列表由MiG(mach ipc)子系统使用。列表是一个地址。我必须给它写信,所以米格挑选名单并发送。 – 2011-05-21 19:11:48

+1

@Nick如果你告诉我们你的问题是什么,回答你的问题会容易得多。如你的问题所示,我们必须猜测。没有生产力。 – 2011-05-21 19:13:38

+0

我不能让列表在堆栈上。它必须堆积如山。 – 2011-05-21 19:16:55

0

您是如何初始化list的?

char** list; 

不会在这种情况下工作,你就必须有像

char* list[20]; 

或动态分配。

1
char** list 

不是“的字节数组”其一个'指针指向字符的指针',你可以把它看作'字符列表列表'。同样,如果你这样定义它,你需要malloc足够的内存来保存数据。

当你写:

list[i] = 'a'; 

它搞乱内存,因为你把一个char 'A' 在指定的位置容纳一个指针。实际上,在大多数编译器中,字符文字都是int类型的,所以实际上存储一个int形式的'a'作为指向内存位置的指针,这会导致各种内存损坏。

如果你想“名单”是在栈上,然后把它定义为:

char list[20] 

如果你想“名单”是在堆中,然后把它定义为:

char* list; 
list = malloc(sizeof(char) * 20); 

在这两种情况下访问它:

list[i] 

而且它不是安全地假定为int的大小等同于一个指针的大小为你在第二个例子中已经完成了。至少我认为那就是你想要做的。

此外,如果你从数据流或类似的东西存储原始字节,你应该使用'unsigned char'而不是'char',为了更安全使用'int8_t',因为你不能总是保证'char '是8位,尽管它在大多数平台上。