m******t 发帖数: 4077 | 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;
} |
e*****w 发帖数: 144 | 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);
|
m******t 发帖数: 4077 | 3 就是说不需要给b 分配内存了, 那么数据是在哪里呢? after strcpy? 在b指向的地
址连续5个byte吗?这样不是很可能把其他的内容overwritten了吗?
【在 e*****w 的大作中提到】 : 符合C++语法,编译器为啥要报错? : : 吧?
|
t******c 发帖数: 348 | 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了吗?
|
k****n 发帖数: 1334 | 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; : }
|
m******t 发帖数: 4077 | 6 是可以的,如果a很小的话,比如说5个byte,但是改到500000的话,就会出错。
所以我特别的confuse.
【在 k****n 的大作中提到】 : 你在说什么? : b没有分配空间,怎么能够strcpy
|
a***f 发帖数: 45 | 7 这个应该是runtime error吧,编译器只管语法,而语法没什么问题吧。当然在有些情况下,编译器可能会给出警告。 |
t****t 发帖数: 6806 | 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; : }
|
t****t 发帖数: 6806 | 9 你也是
【在 m******t 的大作中提到】 : 是可以的,如果a很小的话,比如说5个byte,但是改到500000的话,就会出错。 : 所以我特别的confuse.
|
k****f 发帖数: 3794 | 10 haha,不要这么鄙视new cop
【在 t****t 的大作中提到】 : 你也是
|
|
|
t******c 发帖数: 348 | 11 OK...
没有给指针分配空间就做strcpy是错误的.
【在 t****t 的大作中提到】 : C语言零分,回去重修
|
S*****n 发帖数: 227 | 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; : }
|
m******t 发帖数: 4077 | 13 我是new cop, 大牛给详细讲解一下?看我的第一个贴?
g++ 编译确实是没有问题的,运行也没有问题,但是这个应该是错的,我也知道。
【在 t****t 的大作中提到】 : 你也是
|
t****t 发帖数: 6806 | 14 编译通过+运行通过 != 没错
【在 m******t 的大作中提到】 : 我是new cop, 大牛给详细讲解一下?看我的第一个贴? : g++ 编译确实是没有问题的,运行也没有问题,但是这个应该是错的,我也知道。
|
m******t 发帖数: 4077 | 15 我再补充一下,在linux下用g++编译没错,但是run time error, segmentation error
, 这样就reasonable了。
但是我在windows下用codeblocks 编译运行都没有问题。也是g++的编译器。
这个为什么?
【在 m******t 的大作中提到】 : 我是new cop, 大牛给详细讲解一下?看我的第一个贴? : g++ 编译确实是没有问题的,运行也没有问题,但是这个应该是错的,我也知道。
|
m******t 发帖数: 4077 | 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);
|
k****n 发帖数: 1334 | 17 你那是一个明显的bug
但是bug不必在所有情况下出现
error
【在 m******t 的大作中提到】 : 我再补充一下,在linux下用g++编译没错,但是run time error, segmentation error : , 这样就reasonable了。 : 但是我在windows下用codeblocks 编译运行都没有问题。也是g++的编译器。 : 这个为什么?
|
d*******d 发帖数: 2050 | 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);
|
c********x 发帖数: 84 | 19 variable b is uninitialized. |
c********x 发帖数: 84 | 20 variable b is uninitialized. |