HPPIY 2022-02-14 16:54 采纳率: 80%
浏览 60
已结题

指针数组赋值,vs15弹出strlen.asm文件

C primer plus上一道课后题:
题目:创建一个函数,实现功能:键入一句话,返回一个指针数组,每个指针数组内元素指向一个独立单词。

运行结果及报错内容 :
功能基本都实现了,结果在最后get_alpha函数回调brr指针赋值给的时候出问题了
明明就初始化指针了啊,为什么还能指针间赋值的时候出错

这个是报错框:

img


基于vs2015;

源码如下:

#include<stdio.h>
#include<stdlib.h>

char** get_alpha(char*, int number);

int main(void)
{
    char arr[200];
    int number;
    int i;

    printf("How many words do you wish to enter?");
    scanf("%d", &number);

    char** crr = NULL;

    crr = get_alpha(arr, number);
    for (i = 0; i<number; ++i)
        puts(crr[i]);
    free(crr);
    
    getchar();
    return 0;
}

char** get_alpha(char* arr, int number)
{
    char ** brr;
    int i = 0;
    int j = 0;
    int time = 0;

    brr = (char**)malloc(number*sizeof(char*));

    printf("Enter %d words now:", number);
    do {
        *(brr + j) = arr + i;
        for (i; i < 20; ++i)
        {
            if (i == 0)
                for (int u = 0; u<200; u++)
                    arr[u] = 0;
            if ((arr[i] = getchar()) == ' ')
            {
                arr[i] = 0;
                ++i;
                break;
            }
            else if (arr[i] == '\n')break;
        }
        ++time;
    } while (time != number);

    return brr;
}

看了好几遍感觉都没什么问题,还请各位老哥帮帮忙🤦‍♂️

==========================================================
更新:debug几次后vs15不报错了,直接弹出了strlen.asm文件

img

查阅资料:”请注意,strlen的主循环部分,是以 4 个 char 为一组作为一个DWORD (32 bits) 送到 eax 去检测的,因此要求必须读取 DWORD 时以 4 bytes 对齐,所以如果字符串地址并不对齐,则前面的1~3个char必须逐个字节检测。进入主循环的循环条件相当于以下代码:“
以下是资料出处
https://www.cnblogs.com/hoodlum1980/archive/2010/08/04/1792322.html

我的理解是在37行处 *(brr + j) = arr + i; 用指针赋值时,每一段指针长度不定,没有对齐导致程序卡住?(一个不是很成熟的想法,汇编才开始学)如果是这个问题,又应该如何解决;或者是尽量避免在指针数组中存储并处理长度不等的指针?

  • 写回答

2条回答 默认 最新

  • ty94666 2022-02-15 09:54
    关注
    
    #include<stdio.h>
    #include<stdlib.h>
    
    char** get_alpha(char*, int number);
    
    int main(void)
    {
        char arr[200];
        int number;
        int i;
    
        printf("How many words do you wish to enter?");
        scanf_s("%d", &number);
    
        char** crr = NULL;
    
        crr = get_alpha(arr, number);
        for (i = 0; i<number-1; ++i)
            puts(crr[i]);
        free(crr);
    
        getchar();
        return 0;
    }
    
    char** get_alpha(char* arr, int number)
    {
        char ** brr = new char* ;
        int i = 0;
        int j = 0;
        int time = 0;
    
        *brr =(char*) malloc(number*sizeof(char*));
    
        printf("Enter %d words now:", number);
        do {
            *(brr + j) = arr + i;
            for (i; i < 20; ++i)
            {
                if (i == 0)
                    for (int u = 0; u<200; u++)
                        arr[u] = 0;
                if ((arr[i] = getchar()) == ' ')
                {
                    arr[i] = 0;
                    ++i;
                    break;
                }
                else if (arr[i] == '\n')break;
            }
            ++time;
        } while (time != number);
    
        return brr;
    }
    
    

    修改了一下可以正常运行了,你的主函数中,puts方法所在的循环越过了数组的边界。 将那部分改为i<number - 1 就行;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月20日
  • 已采纳回答 2月20日
  • 修改了问题 2月14日
  • 修改了问题 2月14日
  • 展开全部

悬赏问题

  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算