C分配了指针?这是什么?
我有下面的代码。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但不是”。有人能解释我的意思吗?
这是一个稍微神秘的回应,但我想投诉是,数组a
不点该数据;它包含的数据。
所以这可能需要什么(不指针箭头):
____________
a |a|b|c|d|e|\0|
¨¨¨¨¨¨¨¨¨¨¨¨
数组的名称可以作为一个指针,但它仍然有一个微妙的不同含义。
是的,这就是我的想法。然而,不是数组本质上只是一个指向第一个元素的指针? – Pithikos
数组的名称指向该数组的第一个元素。这是一个指向这个意义上的指针。 – karlphillip
看起来他们想要的图片像[this](http://c-faq.com/aryptr/aryptr2.html)。 –
我想提请他们是这样的:
____________
|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
是一个包含字符串本身的整个数组,而不仅仅是一个指针。这表明您意识到阵列和指针之间的差异。
我不会正好用这种方式绘制“a”。它__是一个指针 –
@Andrey:不,它不是。数组和指针之间有明显的区别。尽管数组标识符在某些上下文中衰减为指针,但这并不会使它们成为指针。试一下'sizeof(a)'和'sizeof(b)',看看你自己的区别。 –
是的,你说得对。但实际上,这在我看来并不重要,我想。 –
实际上没有确定由d
指向的内存内容。它必须包含一些垃圾,来自malloc()
对c
我甚至会尝试区分数据指向生活的地方。
____________
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)
¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨
我认为你是非常正确的:
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
做些什么,你可能有兴趣和你的同事讨论一下,但我不认为是公平地声明你给出了错误的答案。
从你的问题中不清楚你的答案和错误。请尝试将其改为使其更易于理解。 – Neowizard
@karlphillip,c没有填满,它被重新分配。 – Neowizard
不,“c”的内容不是**复制到“d”。 –