user-0 提问: 菜鸟求助，C语言字符指针必须初始化？后面程序只是把字符指针当临时变量，不初始化提示错误？我有一个简单的程序，但我发现好多问题

回复:
user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:*temp=NULL; *temp=...;/将...的值保存到NULL即0地址处，操作系统不让你保存数据到0地址处。  char a; char *temp=&a;//将temp的值初始化为变量a所在地址。 *temp=...;/将...的值保存到temp的值对应地址处，即a变量对应内存地址处。那我这样做为什么还不对呢？char *temp="abc"  其余地方不变，还是运行出错

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:char *temp="abc" ;//在默认不能写只能读的常量内存区分配4个字节并填写为0x61 0x62 0x63 0x00，然后将0x61所在地址赋值给变量temp。 *temp=...;//将...的值保存到temp的值对应地址处，即企图将...保存到前面0x61开始的地址处，操作系统不让。大哥，你解释的太清楚了，菜鸟的福音

user: user-1
content: 你这个程序没必要使用指针啊，如果要使用，你又没有初始化，没有指定的内存空间肯定就报错啦。  如果非要用，你这个程序 只要加上char *temp=(char*)malloc(sizeof(char));就行了  结束时记得free(temp)

user: user-2
content: char *temp="abc" ;//在默认不能写只能读的常量内存区分配4个字节并填写为0x61 0x62 0x63 0x00，然后将0x61所在地址赋值给变量temp。 *temp=...;//将...的值保存到temp的值对应地址处，即企图将...保存到前面0x61开始的地址处，操作系统不让。

user: user-3
content: 出错不要紧，关键是要学会调试

user: user-2
content: *temp=NULL; *temp=...;/将...的值保存到NULL即0地址处，操作系统不让你保存数据到0地址处。  char a; char *temp=&a;//将temp的值初始化为变量a所在地址。 *temp=...;/将...的值保存到temp的值对应地址处，即a变量对应内存地址处。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char *temp ;//temp这个变量里面可以保存一个内存地址，从这个地址开始的若干字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 *temp = arr[i];//由于temp的值没有初始化，可能是一个随机值，给*temp赋值，导致给这个随机值对应的地址处赋值                 arr[i] = arr[j];                 arr[j] = *temp;             }         }     puts(arr);     system("pause");     return 0; }   #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char temp ;//temp这个变量里面可以保存一个字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 temp = arr[i];                 arr[i] = arr[j];                 arr[j] = temp;             }         }     puts(arr);     system("pause");     return 0; } 出错的位置还是*temp=arr[i]这句

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char *temp ;//temp这个变量里面可以保存一个内存地址，从这个地址开始的若干字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 *temp = arr[i];//由于temp的值没有初始化，可能是一个随机值，给*temp赋值，导致给这个随机值对应的地址处赋值                 arr[i] = arr[j];                 arr[j] = *temp;             }         }     puts(arr);     system("pause");     return 0; }   #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char temp ;//temp这个变量里面可以保存一个字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 temp = arr[i];                 arr[i] = arr[j];                 arr[j] = temp;             }         }     puts(arr);     system("pause");     return 0; } 不是输入数字没问题，是输入字符串如果顺序本来就正确就没问题，顺序不对还是会出问题

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char *temp ;//temp这个变量里面可以保存一个内存地址，从这个地址开始的若干字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 *temp = arr[i];//由于temp的值没有初始化，可能是一个随机值，给*temp赋值，导致给这个随机值对应的地址处赋值                 arr[i] = arr[j];                 arr[j] = *temp;             }         }     puts(arr);     system("pause");     return 0; }   #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char temp ;//temp这个变量里面可以保存一个字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 temp = arr[i];                 arr[i] = arr[j];                 arr[j] = temp;             }         }     puts(arr);     system("  [quote=引用 2 楼 zhao4zhong1 的回复:] [code=c]#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char *temp ;//temp这个变量里面可以保存一个内存地址，从这个地址开始的若干字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 *temp = arr[i];//由于temp的值没有初始化，可能是一个随机值，给*temp赋值，导致给这个随机值对应的地址处赋值                 arr[i] = arr[j];                 arr[j] = *temp;             }         }     puts(arr);     system("pause");     return 0; }   #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char temp ;//temp这个变量里面可以保存一个字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 temp = arr[i];                 arr[i] = arr[j];                 arr[j] = temp;             }         }     puts(arr);     system("pause");     return 0; } 我知道为什么一定要初始化了，是我理解错了，我认为是*temp被赋予了一个随机值，而不是temp被赋予了随机值。那为什么改为char *temp=NULL后，输入纯数字没有问题，输入数字加字母又出问题了呢？？

user: user-2
content: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char *temp ;//temp这个变量里面可以保存一个内存地址，从这个地址开始的若干字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 *temp = arr[i];//由于temp的值没有初始化，可能是一个随机值，给*temp赋值，导致给这个随机值对应的地址处赋值                 arr[i] = arr[j];                 arr[j] = *temp;             }         }     puts(arr);     system("pause");     return 0; }   #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) {     int len, i, j;     char temp ;//temp这个变量里面可以保存一个字节当作char来看待     char arr[1025] = { 0 };//arr这个变量的值是一个内存地址，从这个内存地址开始预留1025个字节用来保存最多1025个char     gets(arr);     len = strlen(arr);     for (i = 0;i < len;i++)         for (j = i + 1;j < len;j++)         {             if (arr[i] > arr[j]&&arr[j]!=' ')             {                 temp = arr[i];                 arr[i] = arr[j];                 arr[j] = temp;             }         }     puts(arr);     system("pause");     return 0; }

user: user-0
content: 改为char temp不管输入什么都能得到正确结果，这是为什么？char temp和char *temp不是一样么？？？？？