Redian新闻
>
问个简单的memory allocation 的问题。
avatar
问个简单的memory allocation 的问题。# Programming - 葵花宝典
m*t
1
1, 以下小程序里没有给b allocate space, 为什么编译器不报错呢?g++
2, a[5]到底在内存里面占几个字节?是5个吗?但是最后一个已经给了 '\0', 对吗?
3, a[5]是在stack中还是在heap中啊?如果用new 给b分配地址的话是在heap中,对吧?
#include
using namespace std;
int main()
{
char * b;
char a[5] = "1234";
strcpy(b, a);
cout << a <cout << b << endl;
cout << "size of b " << sizeof(b)<cout << "size of a " << sizeof(a)<return 0;
}
avatar
e*w
2
符合C++语法,编译器为啥要报错?

吧?

【在 m******t 的大作中提到】
: 1, 以下小程序里没有给b allocate space, 为什么编译器不报错呢?g++
: 2, a[5]到底在内存里面占几个字节?是5个吗?但是最后一个已经给了 '\0', 对吗?
: 3, a[5]是在stack中还是在heap中啊?如果用new 给b分配地址的话是在heap中,对吧?
: #include
: using namespace std;
: int main()
: {
: char * b;
: char a[5] = "1234";
: strcpy(b, a);

avatar
m*t
3
就是说不需要给b 分配内存了, 那么数据是在哪里呢? after strcpy? 在b指向的地
址连续5个byte吗?这样不是很可能把其他的内容overwritten了吗?

【在 e*****w 的大作中提到】
: 符合C++语法,编译器为啥要报错?
:
: 吧?

avatar
t*c
4
simple implementation of strcpy is like this:
char *strcpy(char *dest, const char *src)
{
const char *p;
char *q;
for(p = src, q = dest; *p != '\0'; p++, q++)
*q = *p;
*q = '\0';
return dest;
}

【在 m******t 的大作中提到】
: 就是说不需要给b 分配内存了, 那么数据是在哪里呢? after strcpy? 在b指向的地
: 址连续5个byte吗?这样不是很可能把其他的内容overwritten了吗?

avatar
k*n
5
你在说什么?
b没有分配空间,怎么能够strcpy

【在 t******c 的大作中提到】
: simple implementation of strcpy is like this:
: char *strcpy(char *dest, const char *src)
: {
: const char *p;
: char *q;
: for(p = src, q = dest; *p != '\0'; p++, q++)
: *q = *p;
: *q = '\0';
: return dest;
: }

avatar
m*t
6
是可以的,如果a很小的话,比如说5个byte,但是改到500000的话,就会出错。
所以我特别的confuse.

【在 k****n 的大作中提到】
: 你在说什么?
: b没有分配空间,怎么能够strcpy

avatar
a*f
7
这个应该是runtime error吧,编译器只管语法,而语法没什么问题吧。当然在有些情况下,编译器可能会给出警告。
avatar
t*t
8
C语言零分,回去重修

【在 t******c 的大作中提到】
: simple implementation of strcpy is like this:
: char *strcpy(char *dest, const char *src)
: {
: const char *p;
: char *q;
: for(p = src, q = dest; *p != '\0'; p++, q++)
: *q = *p;
: *q = '\0';
: return dest;
: }

avatar
t*t
9
你也是

【在 m******t 的大作中提到】
: 是可以的,如果a很小的话,比如说5个byte,但是改到500000的话,就会出错。
: 所以我特别的confuse.

avatar
k*f
10
haha,不要这么鄙视new cop

【在 t****t 的大作中提到】
: 你也是
avatar
t*c
11
OK...
没有给指针分配空间就做strcpy是错误的.

【在 t****t 的大作中提到】
: C语言零分,回去重修
avatar
S*n
12
您这个strcpy的实现简直就是给hacker打开了系统的大门啊。

【在 t******c 的大作中提到】
: simple implementation of strcpy is like this:
: char *strcpy(char *dest, const char *src)
: {
: const char *p;
: char *q;
: for(p = src, q = dest; *p != '\0'; p++, q++)
: *q = *p;
: *q = '\0';
: return dest;
: }

avatar
m*t
13
我是new cop, 大牛给详细讲解一下?看我的第一个贴?
g++ 编译确实是没有问题的,运行也没有问题,但是这个应该是错的,我也知道。

【在 t****t 的大作中提到】
: 你也是
avatar
t*t
14
编译通过+运行通过 != 没错

【在 m******t 的大作中提到】
: 我是new cop, 大牛给详细讲解一下?看我的第一个贴?
: g++ 编译确实是没有问题的,运行也没有问题,但是这个应该是错的,我也知道。

avatar
m*t
15
我再补充一下,在linux下用g++编译没错,但是run time error, segmentation error
, 这样就reasonable了。
但是我在windows下用codeblocks 编译运行都没有问题。也是g++的编译器。
这个为什么?

【在 m******t 的大作中提到】
: 我是new cop, 大牛给详细讲解一下?看我的第一个贴?
: g++ 编译确实是没有问题的,运行也没有问题,但是这个应该是错的,我也知道。

avatar
m*t
16
那位能回答以下第二第三个问题?谢谢?

吧?

【在 m******t 的大作中提到】
: 1, 以下小程序里没有给b allocate space, 为什么编译器不报错呢?g++
: 2, a[5]到底在内存里面占几个字节?是5个吗?但是最后一个已经给了 '\0', 对吗?
: 3, a[5]是在stack中还是在heap中啊?如果用new 给b分配地址的话是在heap中,对吧?
: #include
: using namespace std;
: int main()
: {
: char * b;
: char a[5] = "1234";
: strcpy(b, a);

avatar
k*n
17
你那是一个明显的bug
但是bug不必在所有情况下出现

error

【在 m******t 的大作中提到】
: 我再补充一下,在linux下用g++编译没错,但是run time error, segmentation error
: , 这样就reasonable了。
: 但是我在windows下用codeblocks 编译运行都没有问题。也是g++的编译器。
: 这个为什么?

avatar
d*d
18
1.符合语法,编译器不报错。但是,b可能指向任意地址,结果是,你把1234写到
一个可能不该写的地方。
2.a[5],是5个byte.最后一个给了\0
3.对

吧?

【在 m******t 的大作中提到】
: 1, 以下小程序里没有给b allocate space, 为什么编译器不报错呢?g++
: 2, a[5]到底在内存里面占几个字节?是5个吗?但是最后一个已经给了 '\0', 对吗?
: 3, a[5]是在stack中还是在heap中啊?如果用new 给b分配地址的话是在heap中,对吧?
: #include
: using namespace std;
: int main()
: {
: char * b;
: char a[5] = "1234";
: strcpy(b, a);

avatar
c*x
19
variable b is uninitialized.
avatar
c*x
20
variable b is uninitialized.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。