我已经写了下面的函数:
int read_words(char* words[], int size, int max_str_len)
{
char* pointers = (char*)malloc(max_str_len * sizeof(char) +1); // the + 1 is for the null
terminator
if(pointers==NULL)
{
free(pointers);
return -1;
}
int i=0;
int j=1;
while((i<size ) && (scanf("%c", & *pointers) != EOF ))
{
while(scanf("%c", & *(pointers + j)) != ' ' && j<max_str_len)
{
j++;
}
*(pointers + j) ='\0';
words[i] = pointers;
j=0;
i++;
}
free(pointers);
return i;}
它应该读取一串字符串(在C语言中定义为字符数组),并从数组单词中为它们分配指针。(字符串的最大长度为max_str_len)
然后我尝试在下面的循环中使用它:
while(i<num_words)
{
while(*(words[i]+j) != '\0')
{
*(words[i]+j) = encrypt(key, *(words[i]+j));
j++;
}
j=0;
i++;
}其中,encrypt获取一个密钥数组,并根据该数组加密它获得的每个字符。
由于某种原因,程序在接收到数组单词的输入后被终止(所以我认为问题出在函数read_words中,我不确定该函数实际上是在扫描单词。
注意:其他试图帮助我使用该函数的人说,我应该扫描整个单词,而不是单个字符,但是该函数的时间复杂度应该是O(size*max_str_len),如果我不将它们作为字符扫描,它将不符合条件。
老实说,我不确定如何使用malloc,我似乎找不到代码的错误。我还有一个关于malloc的一般问题:如果p是某个字节大小的动态分配,arr是一个指针数组:如果p指向一个特定的变量,并且我们定义arr等于p,那么我们将p更改为不同的变量,arr仍然指向第一个变量吗?或者它的值丢失了,现在arr没有指向任何东西或指向新变量?
上面函数的含义:如果我将p定义为:char* p = (char*)malloc(max_atr_len*sizeof(char));
然后我扫描单词,如下所示:scanf(“%s”, & p);
然后我写道:words[i] = p;
如果我扫描一个不同的单词,第一个单词的值是丢失了还是wordsi仍然指向它?
非常感谢您的帮助:)
发布于 2021-06-09 17:40:48
赋值后,两个指针指向相同的数据对象,但您可以自由地将每个指针更改为指向其他地方,而不会影响另一个指针。
发布于 2021-06-09 17:52:12
scanf("%s", p);不会改变p。它改变了p所指向的位置。
words[0] = p;只复制p (地址)的值,没有其他内容。
让我们考虑一下下面的代码片段:
char* p = malloc(...);
scanf("%s", p);
words[0] = p;
scanf("%s", p);
words[1] = p;p只由第一行改变,因此p、words[0]和words[1]都有相同的值:您分配的内存块的地址。
唯一的内存块由第一次调用scanf填充,并被第二次调用scanf覆盖。
words malloc'ed block
+----------+ +---+---+---+---+---+---+---+--...
| --------+-->| I | n | p | u | t | 2 | ␀ |
+----------+ | +---+---+---+---+---+---+---+--...
| --------+
+----------+ |
|
|
p |
+----------+ |
| --------+
+----------+现在让我们考虑一下下面的代码片段:
char* p = malloc(...);
scanf("%s", p);
words[0] = p;
p = malloc(...);
scanf("%s", p);
words[1] = p;words[0]的值是您分配的第二个内存块的地址。和
第一次调用scanf.
scanf.填充了您分配的第二个内存块
words First malloc'ed block
+----------+ +---+---+---+---+---+---+---+--...
| ----------->| I | n | p | u | t | 1 | ␀ |
+----------+ +---+---+---+---+---+---+---+--...
| --------+
+----------+ | Second malloc'ed block
| +---+---+---+---+---+---+---+--...
+-->| I | n | p | u | t | 2 | ␀ |
p | +---+---+---+---+---+---+---+--...
+----------+ |
| --------+
+----------+顺便说一句,请注意您使用scanf是不安全的。如果输入比您预期的要大,就会发生Bad things。
https://stackoverflow.com/questions/67901433
复制相似问题