C primer plus上一道课后题:
题目:创建一个函数,实现功能:键入一句话,返回一个指针数组,每个指针数组内元素指向一个独立单词。
运行结果及报错内容 :
功能基本都实现了,回调指针数组赋值的时候出错。
这个是报错框:
基于vs2015;
之后调试几次后vs15不报错了,直接弹出了strlen.asm文件
查阅资料:”请注意,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;
}
看了好几遍感觉都没什么问题,还请各位老哥帮帮忙🤦♂️,谢谢!