2011-12-01 137 views
8

我有下面的代码。C分配了指针?这是什么?

​​

及行使状态:

绘制数据结构的a,b,c和d(有内容)的图片 在这里你可以看到已经分配和使用箭头显示如何设置指针 。

我的解决办法是:

 ____________ 
a -> |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ___________ 
d -> | | | | | | | 
     ¨¨¨¨¨¨¨¨¨¨¨ 

但是我的解决方案并没有得到接受和响应是“为指针到b 分配的内存,C,d但不是”。有人能解释我的意思吗?

+0

从你的问题中不清楚你的答案和错误。请尝试将其改为使其更易于理解。 – Neowizard

+2

@karlphillip,c没有填满,它被重新分配。 – Neowizard

+0

不,“c”的内容不是**复制到“d”。 –

回答

9

这是一个稍微神秘的回应,但我想投诉是,数组a该数据;它包含的数据。

所以这可能需要什么(不指针箭头):

____________ 
a |a|b|c|d|e|\0| 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 

数组的名称可以作为一个指针,但它仍然有一个微妙的不同含义。

+0

是的,这就是我的想法。然而,不是数组本质上只是一个指向第一个元素的指针? – Pithikos

+2

数组的名称指向该数组的第一个元素。这是一个指向这个意义上的指针。 – karlphillip

+4

看起来他们想要的图片像[this](http://c-faq.com/aryptr/aryptr2.html)。 –

7

我想提请他们是这样的:

 ____________ 
    |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
      a 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     _____________ 
d -> |g|a|r|b|a|g|e| 
     ¨¨¨¨¨¨¨¨¨¨¨¨¨ 

注意的a如何是整个阵列下方,而不是旁边的箭头。这是为了强调a是一个包含字符串本身的整个数组,而不仅仅是一个指针。这表明您意识到阵列指针之间的差异。

+0

我不会正好用这种方式绘制“a”。它__是一个指针 –

+3

@Andrey:不,它不是。数组和指针之间有明显的区别。尽管数组标识符在某些上下文中衰减为指针,但这并不会使它们成为指针。试一下'sizeof(a)'和'sizeof(b)',看看你自己的区别。 –

+0

是的,你说得对。但实际上,这在我看来并不重要,我想。 –

1

实际上没有确定由d指向的内存内容。它必须包含一些垃圾,来自malloc()c

1

我甚至会尝试区分数据指向生活的地方。

____________ 
a|a|b|c|d|e|\0| (in data segment or on stack) 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
b|ptr->| -> |f|g|h|i|j|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
c|ptr->| -> |k|l|m|n|o|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ___________ 
d|ptr->| -> |X|X|X|X|X|X| (on heap) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨ 
1

我认为你是非常正确的:

char a[] = "abcde"; 
    printf("a[]: [%s] length:%d\n", a, strlen(a)); 

    char* b = "fghij"; 
    printf("*b: [%s] length:%d\n", b, strlen(b)); 

    char* c = (char*)malloc(6); 
    char* d = c; 

    c = "klmno"; 
    printf("*d = c: d is [%s] length:%d\n", d, strlen(d)); 
    printf("*d = c: c is [%s] length:%d\n", c, strlen(c)); 

输出:

a[]: [abcde] length:5 
*b: [fghij] length:5 
*d = c: d is [] length:0 
*d = c: c is [klmno] length:5 

注:即使strlen()搜索的NULL字符可以遍历在字符串和数字字符数组上,出现NULL本身没有添加到最后的总和,这就是为什么它报告5个字符,而不是6。

至于你的回答没有被接受,你的老师可能会有一些其他形式的表示,你可能希望你为数组a做些什么,你可能有兴趣和你的同事讨论一下,但我不认为是公平地声明你给出了错误的答案。