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

菜鸟程序员员 2015-12-02 03:24:17
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int len, i, j;
char *temp ;
char arr[1025] = { 0 };
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;
}


程序是对输入的字符串按ASCII排序,这程序在VS2015编译不通过,提示gets未定义和使用了未初始化的局部变量temp,如果改为char *temp=NULL,输入纯数字比如12345可以得到正确结果,如果输入有字母,比如123qwe,则输出提示错误,0xC0000005: 写入位置 0x00000000 时发生访问冲突,这是为何?
...全文
237 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜鸟程序员员 2015-12-03
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
*temp=NULL; *temp=...;/将...的值保存到NULL即0地址处,操作系统不让你保存数据到0地址处。 char a; char *temp=&a;//将temp的值初始化为变量a所在地址。 *temp=...;/将...的值保存到temp的值对应地址处,即a变量对应内存地址处。
那我这样做为什么还不对呢?char *temp="abc" 其余地方不变,还是运行出错
菜鸟程序员员 2015-12-03
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
char *temp="abc" ;//在默认不能写只能读的常量内存区分配4个字节并填写为0x61 0x62 0x63 0x00,然后将0x61所在地址赋值给变量temp。 *temp=...;//将...的值保存到temp的值对应地址处,即企图将...保存到前面0x61开始的地址处,操作系统不让。
大哥,你解释的太清楚了,菜鸟的福音
nena2749 2015-12-03
  • 打赏
  • 举报
回复
你这个程序没必要使用指针啊,如果要使用,你又没有初始化,没有指定的内存空间肯定就报错啦。 如果非要用,你这个程序 只要加上char *temp=(char*)malloc(sizeof(char));就行了 结束时记得free(temp)
赵4老师 2015-12-03
  • 打赏
  • 举报
回复
char *temp="abc" ;//在默认不能写只能读的常量内存区分配4个字节并填写为0x61 0x62 0x63 0x00,然后将0x61所在地址赋值给变量temp。 *temp=...;//将...的值保存到temp的值对应地址处,即企图将...保存到前面0x61开始的地址处,操作系统不让。
苏叔叔 2015-12-02
  • 打赏
  • 举报
回复
出错不要紧,关键是要学会调试
赵4老师 2015-12-02
  • 打赏
  • 举报
回复
*temp=NULL; *temp=...;/将...的值保存到NULL即0地址处,操作系统不让你保存数据到0地址处。 char a; char *temp=&a;//将temp的值初始化为变量a所在地址。 *temp=...;/将...的值保存到temp的值对应地址处,即a变量对应内存地址处。
菜鸟程序员员 2015-12-02
  • 打赏
  • 举报
回复
引用 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]这句
菜鸟程序员员 2015-12-02
  • 打赏
  • 举报
回复
引用 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;
}
不是输入数字没问题,是输入字符串如果顺序本来就正确就没问题,顺序不对还是会出问题
菜鸟程序员员 2015-12-02
  • 打赏
  • 举报
回复
引用 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后,输入纯数字没有问题,输入数字加字母又出问题了呢??
赵4老师 2015-12-02
  • 打赏
  • 举报
回复
#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;
}
菜鸟程序员员 2015-12-02
  • 打赏
  • 举报
回复
改为char temp不管输入什么都能得到正确结果,这是为什么?char temp和char *temp不是一样么?????

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧