标题:函数指针数组的 出现访问错误
只看楼主
niuniuchiniu
Rank: 1
等 级:新手上路
帖 子:20
专家分:9
注 册:2019-8-10
结帖率:33.33%
已结贴  问题点数:20 回复次数:5 
函数指针数组的 出现访问错误
大神们,如下代码如下图,

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *mystrcat(char *a, char *b)
{
    return strcat(a, b);
}
char *mystrcpy(char *a, char *b)
{
    return strcpy(a, b);
}
char *mystrstr(char *a, char*b)
{
    return strstr(a, b);
}
void main()
{
    char *a = "huawei";
    char *b = "jia you";
   
    char *(*p[3])(a, b) = { mystrcat,mystrcpy,mystrstr};   
   
   
    printf("%s", (p[1])(a,b));
    system("pause");
}

搜索更多相关主题的帖子: char return include 函数 错误 
2019-09-23 12:07
niuniuchiniu
Rank: 1
等 级:新手上路
帖 子:20
专家分:9
注 册:2019-8-10
得分:0 
如果换成数组形式就可以运行,难道是访问了常量指针a对应的"huawei"的那个地址?
2019-09-23 12:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:18 
"huawei" 的类型是 const char[7],所以正确写法是 const char* a = "huawei";
在蛮荒时代,C语言没有const,所以只能写成 char* a = "huawei",由程序员自己保证不去修改a指向的内容;
随后,C语言增加了const,但看到遗留下的大量C代码,只能规定不加const也不算语法错,没那么大人力去整改。

简而言之:
在古代,char* a = "huawei"; 是正确的写法,但如果修改 a 指向的内容,属于未定义行为;
在当代,const char* a = "huawei"; 是推荐的写法,而如果手贱一定要写成 char* a = "huawei" 也能编译通过,但如果修改 a 指向的内容,属于未定义行为。
2019-09-23 13:03
ZJYTY
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:92
专家分:700
注 册:2018-12-20
得分:2 
试图修改常量

-------------------------------若有不当之处,敬请谅解-------------------------------
2019-09-23 14:56
niuniuchiniu
Rank: 1
等 级:新手上路
帖 子:20
专家分:9
注 册:2019-8-10
得分:0 
回复 3楼 rjsp
谢谢大神这么认真的码字,谢谢啦,C prime 上也是这么说的.
2019-09-25 11:48
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 5楼 niuniuchiniu
程序代码:
#include <stdio.h>
#include <string.h>

char* mystrcat( char* restrict a, const char* restrict b )
{
    return strcat( a, b );
}
char* mystrcpy( char* restrict a, const char* restrict b )
{
    return strcpy( a, b );
}
char* mystrstr( const char* a, const char* b )
{
    return strstr( a, b );
}

int main( void )
{
    {
        char a[14] = "huawei"; // 因为结果是 "huaweijia you",长度14,所以数组长度最小不得低于14
        const char* b = "jia you";
        mystrcat( a, b );
        puts( a );
    }

    {
        char a[8]; // 因为结果是 "jia you",长度8,所以数组长度最小不得低于8
        const char* b = "jia you";
        mystrcpy( a, b );
        puts( a );
    }

    {
        const char* a = "huawei";
        const char* b = "we";
        const char* p = strstr( a, b );
        if( p )
            puts( p );
    }
}
2019-09-25 12:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-496953-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.230891 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved