鱼C论坛

 找回密码
 立即注册
查看: 4315|回复: 14

哪位大侠帮我看看,编译没有错,执行时总说调用了xx

[复制链接]
发表于 2013-4-8 00:12:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<string.h>
void sort(char *ptr1[],int n);
void main()
{    int i;
   
char *prt[4],str[4][20];
for(i=0;i<4;i++)
  gets(str[i]);
printf("\n");
for(i=0;i<4;i++)
    prt[i]=str[i];
printf("original string:\n");
for(i=0;i<4;i++)
  printf("%s\n",prt[i]);
sort(prt,4);
printf("sorted string:\n");
for(i=0;i<4;i++)
  puts(str[i]);
}
void sort(char *ptr1[],int n)
{    char * temp;
int i,j;
for(i=0;i<n-1;i++)
  for(j=0;j<n-1-i;j++)
  if(strcmp(ptr1[j],ptr1[j+1])>0)
  {
   strcpy(temp,ptr1[j]);
   strcpy(ptr1[j],ptr1[j+1]);
   strcpy(ptr1[j+1],temp);
  }
printf("sorted string:\n");
for(i=0;i<n;i++)
  printf("%s\n",ptr1[i]);
  
  
}
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-8 00:15:13 | 显示全部楼层
总是执行后,总是说调用xxxx内存,该内存不能被写,程序课本抄的,大家帮忙看看,谢谢:loveliness:
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-8 01:53:24 | 显示全部楼层
别的先不说 ,就你这个代码规范,你让人怎么调??
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-8 02:10:24 | 显示全部楼层
就看你冒泡排序里面的局部变量定义就有问题。
char * temp;  

你的目的是通过 strcpy 交换地址,但是你定义temp的时候是一个未知的地址值。strcpy的定义时将源地址字符处拷贝到目标地址。但是你现在的temp都不知道是什么地址值,如何拷贝呢??C0000005是内存访问失败的提示。
你将 char *temp 定义为 char chTemp[20] = {0};  就可以了。你试下吧。
而且以后编程要注意代码规范,而且定义变量一定要初始化,养成良好的编码习惯。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-8 12:51:37 | 显示全部楼层
谢谢,还真行,又前进了一步:D
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-8 13:13:48 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-8 15:01:53 | 显示全部楼层
char *temp;  是一个地址类型的变量 编译器总共就分配4个字节的空间给它,你说你用strcpy往这4个字节里面拷贝一段20个字节的长度怎么拷的进去呢。
如果你一定要用指针我只能说无奈
char *temp;
temp = (char *)malloc(sizeof(char) * 20);  // 动态再分配20个字节空间就可以了。
这不是和定义一个数组一样吗。 char chTemp[20];

你要进行交换拷贝的ptr1是一个指向20个字节地址单元的指针,所以你也一定要分配足够大的空间才可以进行互相拷贝,否则就会发生地址访问越界,和内存泄露问题。你进入函数之后,在栈里面会保存返回地址和调用者的栈信息和初始化一些局部变量,如果你访问越界就很有可能覆盖掉原有的栈信息和返回地址信息,当出函数的时候就找不到返回地址了,你说函数应该如何返回呢。所以一定要主要内存的分配和类型的匹配。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-8 18:20:04 | 显示全部楼层
梦想与现实 发表于 2013-4-8 15:01
char *temp;  是一个地址类型的变量 编译器总共就分配4个字节的空间给它,你说你用strcpy往这4个字节里面拷 ...

谢谢,终于弄清楚,麻烦再帮我看看这代码,还是说调用内存,该内存不能被写
#include<stdio.h>感恩无私的分享与奉献 :)
#include<string.h>
#include<malloc.h>
void catstr(char *dest,char *src);
void main()
{
        char *dest;
        char *src=" help you?";
        if((dest=(char *)malloc(sizeof(char)*50))==NULL)
        {   
                printf("no memory\n");
                exit(1);////表示程序出错时退出程序
        }
        dest="Can I";
        catstr(dest,src);
        puts(dest);
}
  
void catstr(char *dest,char *src)
{
         while(*dest)
                 dest++;
         while(*dest++=*src++);
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-8 19:33:12 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<malloc.h>
  4. #include <stdlib.h>

  5. void catstr(char *dest,char *src)
  6. {
  7.     while(*dest)
  8.         dest++;
  9.     while(*dest++=*src++);
  10. }

  11. int main(int argc, char* argv[])
  12. {

  13.         char *dest;
  14.         char *src=" help you?";
  15.         if((dest=(char *)malloc(sizeof(char)*50))==NULL)
  16.         {   
  17.             printf("no memory\n");
  18.             exit(1);////表示程序出错时退出程序
  19.         }
  20. //       dest="Can I"; // 这里注释掉
  21.         strcpy(dest, "Can I"); // 往地址里面拷贝字符串用strcpy
  22.         catstr(dest,src);
  23.         puts(dest);
  24.    
  25.    
  26.         return 0;
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-8 20:08:49 | 显示全部楼层
万分感谢:$
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-8 22:01:02 | 显示全部楼层

请允许我叫你为大神
现在又有问题了,我现在改用指向指针的指针解决,又有问题了,帮帮忙吧
#include<stdio.h>
#include<string.h>
#include<malloc.h>
void sort(char **ptr1,int n); ////指向指针的指针

void main()
{    int i;
   
        char **prt,str[4][20];
        for(i=0;i<4;i++)
                gets(str[i]);
        printf("\n");
        for(i=0;i<4;i++)
           *(prt+i)=str[i];
        printf("original string:\n");
        for(i=0;i<4;i++)
                printf("%s\n",*(prt+i));
        sort(prt,4);
        printf("sorted string:\n");
        for(i=0;i<4;i++)
                puts(*(prt+i));

}
void sort(char **ptr1,int n)
{ int i,j;
    char *temp;
    temp=(char*)malloc(sizeof(char)*20);
       
        for(i=0;i<n-1;i++)
                for(j=0;j<n-1-i;j++)
                if(strcmp(*(ptr1+j),*(ptr1+j+1))>0)
                {
                        strcpy(temp,*(ptr1+j));
                        strcpy(*(ptr1+j),*(ptr1+j+1));
                        strcpy(*(ptr1+j+1),temp);
                }
        printf("sorted string:\n");
        for(i=0;i<n;i++)
                printf("%s\n",*(ptr1+i));
               
               
}
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-8 22:05:58 | 显示全部楼层

大神,为什么不能用dest="Can I"呢,我搞不懂,提示一下吧,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-8 23:25:50 | 显示全部楼层
明白人 发表于 2013-4-8 22:05
大神,为什么不能用dest="Can I"呢,我搞不懂,提示一下吧,谢谢

首先在你操作字符串的时候你要清楚 变量的定义和赋值是两个不同的操作。
char *dest = "Can I";   // 这样在定义的时候赋值时允许的,这样等于将一个常量字符串写到了dest为起始的地址空间中。

但是如果你 定义了 char *dest; 并没有在定义的同时赋值,那就等于你定义了一个字符指针类型的变量,它就是一个地址变量。
然后C语言规定,对于除了在赋值的时候可以直接写入字符串,其它的时候都要用 strcpy将字符串写入到指定的地址空间中。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-9 00:23:20 | 显示全部楼层
明白人 发表于 2013-4-8 22:01
请允许我叫你为大神
现在又有问题了,我现在改用指向指针的指针解决,又有问题了,帮帮忙吧
{ ...
  1. // 111.cpp : Defines the entry point for the console application.
  2. //

  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>

  7. void Sort(char (**ppStr)[20], int nLen)
  8. {
  9.     int i = 0;
  10.     int j = 0;
  11.     int k = 0;
  12.     char chTemp[20] = {0};

  13.     // 选择排序   从小到大
  14.     for (i = 0; i < nLen - 1; i++)
  15.     {
  16.         k = i;
  17.         for (j = i+1; j < nLen; j++)
  18.         {
  19.             if ( strcmp(*(*ppStr + k), *(*ppStr + j)) > 0)
  20.             {
  21.                
  22.                 k = j;
  23.             }
  24.         }

  25.         strcpy(chTemp, *(*ppStr + i));
  26.         strcpy(*(*ppStr + i), *(*ppStr + k));
  27.         strcpy(*(*ppStr + k), chTemp);
  28.     }
  29. }

  30. int main(int argc, char* argv[])
  31. {
  32.     // 定义二位数组
  33.     char strAry[3][20] = {0};

  34.     // 定义二位数组指针
  35.     char (*pStr)[20] = strAry;

  36.     // 定义二级二位数组指针
  37.     char (**ppStr)[20] = &pStr;

  38.     int i = 0;
  39.    
  40.     puts("请输入3组字符串:");
  41.     // 循环输入
  42.     for (i = 0; i < 3; i++)
  43.     {
  44.         scanf("%s", (*ppStr+i));
  45.     }
  46.    
  47.     // 排序
  48.     Sort(ppStr, 3);
  49.    

  50.     puts("从小到大排序:");
  51.     // 循环输出
  52.     for (i = 0; i < 3; i++)
  53.     {
  54.         printf("%s\r\n", (*ppStr+i));
  55.     }
  56.         return 0;
  57. }

  58. /*
  59. 请输入3组字符串:
  60. cccccc
  61. bbbbbb
  62. aaaaaa
  63. 从小到大排序:
  64. aaaaaa
  65. bbbbbb
  66. cccccc
  67. Press any key to continue
  68. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-10 11:36:41 | 显示全部楼层

strcmp(*(*ppStr + k), *(*ppStr + j))中的*(*ppStr + k)该怎么理解呢,这是个地址呢,还是个值呢,*ppstr==pstr???,如果这样的整个是代表整个值吗
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-4 10:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表