我试图按字母顺序对这个链接列表中的名称进行排序,但我不确定采取哪种方法是正确的。我创建了一个方法来比较列表中的名称并每次更新我的当前指针。我不断收到错误。谁能建议一种更好的方法来对名称进行排序?我是 C 语言的新手,我正在努力寻找更好的方法来实现这一点。任何帮助将不胜感激。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HOW_MANY 7
char *names[HOW_MANY] = { "Ben", "Chris", "RDJ", "Mark", "Scarlet", "Samuel", "Tom" };
int ages[HOW_MANY] = { 22, 24, 50, 26, 18, 32, 24 };
/* declare your struct for a person here */
struct person {
char *name;
int age;
struct person *next;
};
static struct person *compare_people(struct person *headptr, struct person *headptr) {
int didSwap = 1, limit = HOW_MANY - 1;
struct person *temp;
struct person …Run Code Online (Sandbox Code Playgroud) if p和temp是两个指针变量where pcontains NULL并temp指向一些内存地址.
现在假设 p = temp;
这意味着现在p指向与temp指向何处相同的地址.
这是否意味着两个指针变量p,temp现在指向相同的内存地址?
我正在研究K&R的练习2-1,目标是计算不同变量类型的范围,下面是我计算short int可以包含的最大值的函数:
short int max_short(void) {
short int i = 1, j = 0, k = 0;
while (i > k) {
k = i;
if (((short int)2 * i) > (short int)0)
i *= 2;
else {
j = i;
while (i + j <= (short int)0)
j /= 2;
i += j;
}
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是这个函数返回的值是:-32768这显然是错误的,因为我期待一个正值.我无法弄清楚问题出在哪里,我使用相同的函数(在变量类型中有变化)来计算int可以包含的最大值,并且它有效...
我虽然问题可能是由于if和while语句内部的比较引起的,因此类型转换却没有帮助......
是什么原因引起了这个?提前致谢!
编辑:感谢Antti Haapala的解释,符号位的溢出导致未定义的行为,而不是负值.
我以为C中的整数首先存储了最高有效位,例如,数字5将是0...0101。我以为我可以通过强制C让我假装一个特定的内存地址是an,int然后像在那儿一样添加到这些位来操纵特定位int。
我试图在内存中设置0的0位,然后尝试将其添加255到不同的内存地址中,这似乎工作得好像最低有效位先于最高有效位存储在内存中,因为当我在内存地址中添加1并更改时我那里的位数更大,而不是较小。如果最高有效位较早地存储在内存中,那么将255高8位是next的开头,那么将其添加到比原地址高1个字节的内存地址根本不会影响该地址int。我想知道我是否正确地解释了这一点,并且整数首先以最低有效位存储。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main() {
int *x = malloc(8); //getting 4 memory addresses
int *y = malloc(8);
int *z = malloc(8);
int *a = malloc(8);
x[0] = 0; //setting 64 bits past memory addresses to 0s
x[1] = 0;
y[0] = 0;
y[1] = 0;
z[0] = 0;
z[1] = 0;
a[0] = 0;
a[1] = 0;
*((int*)((int)x)) = 255; …Run Code Online (Sandbox Code Playgroud) 我必须制作2个程序。一个在共享内存上写入矩阵,另一个必须读取并排序该矩阵。
我创建了一个共享结构,即要放入共享内存中的var。但是我不知道如何读取和存储在另一个变量上。
我的共享结构:
#define QUANTIDADE 100
#define TAMANHO 1000
struct shared_use_st {
int written_by_you;
int num_processos_executando;
int arrays[QUANTIDADE][TAMANHO];
};
Run Code Online (Sandbox Code Playgroud)
如何在编写者代码上创建矩阵:
int i, j;
for (j = 0; j < QUANTIDADE; j++) {
for (i = 0; i < TAMANHO; i++) {
shared_stuff->arrays[j][i] = rand();
}
}
Run Code Online (Sandbox Code Playgroud)
我要如何从内存中读取:
int my_arrays[QUANTIDADE][TAMANHO];
int main() {
[...]
my_arrays = shared_stuff->arrays; //Error
[...]
}
Run Code Online (Sandbox Code Playgroud) 确保仅定义两个名称之一的最简单方法是什么,例如:
#define USE_OPTION1
#define USE_OPTION2
#if not(USE_OPTION1 ^ USE_OPTION2)
#error "You must use at least one option, but not both"
#endif
Run Code Online (Sandbox Code Playgroud)
我知道 C 或 C++ 中没有逻辑异或,那么最好的方法是什么?不一定是这样,是吗:
#define USE_OPTION1
#define USE_OPTION2
#ifdef USE_OPTION1
#ifdef USE_OPTION2
#error "You can't use both"
#endif
#endif
#ifdef USE_OPTION2
#ifdef USE_OPTION1
#error "You can't use both"
#endif
#endif
#ifndef USE_OPTION1
#ifndef USE_OPTION2
#error "You must use at least one"
#endif
#endif
Run Code Online (Sandbox Code Playgroud) 考虑下一段代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int printf(const char *format, ...)
{
va_list args;
return 1;
}
int main()
{
printf("Hello there");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
事实上,printf什么也没有打印。这意味着,编译器“更喜欢”这个函数而不是<stdio.h>. 但C不允许函数重写,根据我的理解,它应该抛出冲突错误的错误。
谁能解释这种行为?
功能strdup()并strndup()最终纳入即将推出的 C23 标准:
7.24.6.4
strdup函数概要
Run Code Online (Sandbox Code Playgroud)#include <string.h> char *strdup(const char *s);该
strdup函数在分配的空间中创建由 指向的字符串的副本s,就像通过调用 一样malloc。返回
该strdup函数返回一个指向重复字符串的第一个字符的指针。返回的指针可以传递给free. 如果无法分配空间,则该strdup函数返回空指针。7.24.6.5
strndup函数概要
Run Code Online (Sandbox Code Playgroud)#include <string.h> char *strndup(const char *s, size_t size);该
strndup函数创建一个字符串,该字符串初始化为不超过size由 指向的数组的初始字符s,直到第一个空字符(以先到者为准),在分配的空间中,就像调用 一样malloc。如果 by 指向的数组的s第一个字符中不包含 nullsize,则将 null 附加到数组的副本中。返回
该strndup函数返回一个指向所创建字符串的第一个字符的指针。返回的指针可以传递给free. 如果无法分配空间,则该strndup函数返回空指针。
strnlen为什么不考虑包含POSIX-2008 函数?
#include …Run Code Online (Sandbox Code Playgroud) 我有一个 C 程序,我在其中定义和使用我自己的printf()函数。但是,仅输出第一个printfie 。printf("Hello World 1\n");但为什么?
int printf(const char *__restrict __format, ...);
int printf(const char *__restrict __format, ...) {}
int main() {
printf("Hello World 1\n");
printf("Hello World %d\n", 2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Hello World 1
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么
#include <stdio.h>
int main(void)
{
int a = 0, b = 1;
a = (a = 5) && (b = 0);
printf("%d", a);
printf("%d", b);
}
Run Code Online (Sandbox Code Playgroud)
变量的值a被更新两次,这违反了 C 标准。所以我认为这将取决于编译器。我在很多在线 C 编译器中运行了这段代码,所有编译器都给出了相同的输出。