HPPIY 2022-02-15 09:02 采纳率: 80%
浏览 54
已结题

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

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

运行结果及报错内容 :
功能基本都实现了,回调指针数组赋值的时候出错。

这个是报错框:

img


基于vs2015;

之后调试几次后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; 用指针赋值时,每一段指针长度不定,没有对齐导致程序卡住?(一个不是很成熟的想法,汇编才开始学)如果是这个问题,又应该如何解决;或者是尽量避免在指针数组中存储并处理长度不等的指针?

源码如下:

#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;
}

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

  • 写回答

1条回答 默认 最新

  • 爱晚乏客游 2022-02-15 09:25
    关注

    你的输入部分有问题,导致最后的的brr返回为空,puts()输出空字符串报错。
    我没太看得懂你do while 循环部分是在做什么?getchar每次只能接收一个字符,但是看你的意思应该是接收一个字符串,而你里面的for循环限定了你的i不可超过20,那么你for上面的那句*(brr + j) = arr + i;有什么作用呢?你的j自增呢?每次都是0你觉得对吗?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月20日
  • 已采纳回答 2月15日
  • 创建了问题 2月15日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装