user-0 提问: 初学C语言世界，发生了危机。。

回复:
user: user-1
content: http://blog.csdn.net/hou09tian/article/details/75042206 请多指教

user: user-2
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: StrPrint a;只有一个单元，之后Print++就会导致越界 14行：StrPrint a;改成StrPrint a[2]; 16行：Print=a;  引用 14 楼 cfjtaishan 的回复:[quote=引用 5 楼 fight_in_dl 的回复:] 越界访问内存。 int main() { 	StrPrint *Print = new StrPrint[2]; //申请了大小为2个StrPrint类型的内存空间。 	Print->PrintName = "123"; 	Print->FileName = "123132"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print++;  //现在可以对Print++指向的区域合法读写 	Print->PrintName = "456"; 	Print->FileName = "456465"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print--; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	system("pause"); 	delete[] Print; 	return 0; } 对于C语言是不支持这样对字符串赋值的，建议楼主使用strcpy或strncpy[/quote] PrintName和FileName是指针，这样的赋值在C语言是可以的；但PrintName和FileName的类型在存在风险，在C++可能会报错，主要原因字串是 const char *，因此，这两个类型需要使用const char *定义就可以了

user: user-4
content: #include "stdafx.h" #include "stdlib.h" #include "string"   typedef struct Print{     char * FileName;     char * PrintName; }StrPrint; int _tmain(int argc, _TCHAR* argv[]) {     StrPrint a[2];     StrPrint *Print;     Print=&a[0];     //Print->PrintName="123";    //Print->FileName="123132";     Print->PrintName = (char *)malloc(12);     strcpy(Print->PrintName, "123");     Print->FileName = (char *)malloc(12);     strcpy(Print->FileName, "123132");     printf("%s,%s\n",Print->PrintName,Print->FileName);     Print++;     Print->PrintName = (char *)malloc(12);     strcpy(Print->PrintName, "456");     Print->FileName = (char *)malloc(12);     strcpy(Print->FileName, "456465");     printf("%s,%s\n",Print->PrintName,Print->FileName);     Print--;     printf("%s,%s\n",Print->PrintName,Print->FileName);     system("pause");     return 0; }

user: user-4
content: 引用 5 楼 fight_in_dl 的回复:越界访问内存。 int main() { 	StrPrint *Print = new StrPrint[2]; //申请了大小为2个StrPrint类型的内存空间。 	Print->PrintName = "123"; 	Print->FileName = "123132"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print++;  //现在可以对Print++指向的区域合法读写 	Print->PrintName = "456"; 	Print->FileName = "456465"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print--; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	system("pause"); 	delete[] Print; 	return 0; } 对于C语言是不支持这样对字符串赋值的，建议楼主使用strcpy或strncpy

user: user-0
content: 引用 12 楼 fight_in_dl 的回复:引用那为什么输出的时候直接输出地址就可以得到里面的值呢？   因为用的是%s格式字符串，对应参数必须是字符串首字符的地址，以输出整个字符串。  类似问题，手头要有本C语言的书就好了。 // test2.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include "stdlib.h" #include "string"  typedef struct Print{ 	char * FileName; 	char * PrintName; }StrPrint; int _tmain(int argc, _TCHAR* argv[]) { 	StrPrint *Print; 	Print=(StrPrint *)malloc(sizeof(struct Print)); 	Print->PrintName="123"; 	Print->FileName="123132"; 	scanf("%s",Print->FileName); 	printf("%s,%s\n",Print->PrintName,Print->FileName); 	Print++; 	Print->PrintName="456"; 	Print->FileName="456465"; 	printf("%s,%s\n",Print->PrintName,Print->FileName); 	Print--; 	printf("%s,%s\n",Print->PrintName,Print->FileName); 	system("pause"); 	return 0; }   我的代码是这样的，可以帮我看看是什么原因吗？最好是修正一下，我好能够看懂。。谢谢！

user: user-5
content: 引用那为什么输出的时候直接输出地址就可以得到里面的值呢？   因为用的是%s格式字符串，对应参数必须是字符串首字符的地址，以输出整个字符串。  类似问题，手头要有本C语言的书就好了。

user: user-0
content: 引用 9 楼 fight_in_dl 的回复:scanf("%s",&Print->FileName)  应该是：  scanf("%s",Print->FileName)  //FileName为指针变量，其值是地址，不用再加& 那为什么输出的时候直接输出地址就可以得到里面的值呢？

user: user-1
content: 同意楼上各位所说的。 Stack around the variable 'a' was corrupted.的意思是变量“a”周围的栈被破坏。 如图1所示  Print的内容即a的地址是0x00BDF740，0x00BDF740~0x00BDF747之间的栈是可用的 而Print++的值是0x00BDF748，0x00BDF748~0x00BDF74E之间的栈是不可用的，但是在程序中进行了赋值，所以会说“a”周围的栈被破坏了。 图2是图1中四个值对应的字符串  程序改为如下：  StrPrint a[2];     StrPrint *Print;  Print=a;

user: user-5
content: scanf("%s",&Print->FileName)  应该是：  scanf("%s",Print->FileName)  //FileName为指针变量，其值是地址，不用再加&

user: user-0
content: 引用 5 楼 fight_in_dl 的回复:越界访问内存。 int main() { 	StrPrint *Print = new StrPrint[2]; //申请了大小为2个StrPrint类型的内存空间。 	Print->PrintName = "123"; 	Print->FileName = "123132"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print++;  //现在可以对Print++指向的区域合法读写 	Print->PrintName = "456"; 	Print->FileName = "456465"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print--; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	system("pause"); 	delete[] Print; 	return 0; } 我把输入改成了这样，为什么执行不了，会报错 scanf("%s",&Print->FileName)

user: user-2
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-5
content: 越界访问内存。 int main() { 	StrPrint *Print = new StrPrint[2]; //申请了大小为2个StrPrint类型的内存空间。 	Print->PrintName = "123"; 	Print->FileName = "123132"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print++;  //现在可以对Print++指向的区域合法读写 	Print->PrintName = "456"; 	Print->FileName = "456465"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print--; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	system("pause"); 	delete[] Print; 	return 0; }

user: user-0
content: 引用 2 楼 user-6 的回复:malloc分配内存或改成数组，不能直接把字符串赋给char* 我把输入改成了 scanf("%s",&Print->FileName); 就会报这种错误。 test2.exe 中的 0x565414cf (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00333132 时发生访问冲突

user: user-3
content: StrPrint a;只有一个单元，之后Print++就会导致越界 14行：StrPrint a;改成StrPrint a[2]; 16行：Print=a;

user: user-6
content: malloc分配内存或改成数组，不能直接把字符串赋给char*

user: user-0
content: Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. 运行结束后会弹出这个对话框。。。