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


#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 就行;

28行 ,char ** brr 这个是个野指针啊,你这一句要么赋值,要么new一个