小编chq*_*lie的帖子

C 中的链接列表按字母顺序排序?

我试图按字母顺序对这个链接列表中的名称进行排序,但我不确定采取哪种方法是正确的。我创建了一个方法来比较列表中的名称并每次更新我的当前指针。我不断收到错误。谁能建议一种更好的方法来对名称进行排序?我是 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)

c sorting

4
推荐指数
1
解决办法
1万
查看次数

两个指针变量可以指向相同的内存地址吗?

if ptemp是两个指针变量where pcontains NULLtemp指向一些内存地址.

现在假设 p = temp;

这意味着现在p指向与temp指向何处相同的地址.

这是否意味着两个指针变量p,temp现在指向相同的内存地址?

c linked-list data-structures

4
推荐指数
1
解决办法
7194
查看次数

在C中查找short int变量的最大值

我正在研究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可以包含的最大值,并且它有效...

我虽然问题可能是由于ifwhile语句内部的比较引起的,因此类型转换却没有帮助......

是什么原因引起了这个?提前致谢!

编辑:感谢Antti Haapala的解释,符号位的溢出导致未定义的行为,而不是负值.

c size short typecase

4
推荐指数
1
解决办法
922
查看次数

c中的整数如何存储在内存中?

我以为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)

c memory

4
推荐指数
1
解决办法
105
查看次数

从类型'int(*)[1000]分配给类型'int [100] [1000]'时的类型不兼容

我必须制作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)

c

4
推荐指数
1
解决办法
52
查看次数

你如何在 C 预处理器中使用定义进行逻辑异或异或

确保仅定义两个名称之一的最简单方法是什么,例如:

#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)

c c++ preprocessor

4
推荐指数
1
解决办法
71
查看次数

为什么我能够用C语言重写printf?

考虑下一段代码:

#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不允许函数重写,根据我的理解,它应该抛出冲突错误的错误。

谁能解释这种行为?

c

4
推荐指数
1
解决办法
590
查看次数

为什么 strnlen() 不考虑包含在 C23 中?

功能strdup()strndup()最终纳入即将推出的 C23 标准:

7.24.6.4strdup函数

概要

#include <string.h>
char *strdup(const char *s);
Run Code Online (Sandbox Code Playgroud)

strdup函数在分配的空间中创建由 指向的字符串的副本s,就像通过调用 一样malloc

返回
strdup函数返回一个指向重复字符串的第一个字符的指针。返回的指针可以传递给free. 如果无法分配空间,则该strdup函数返回空指针。

7.24.6.5strndup函数

概要

#include <string.h>
char *strndup(const char *s, size_t size);
Run Code Online (Sandbox Code Playgroud)

strndup函数创建一个字符串,该字符串初始化为不超过size由 指向的数组的初始字符s,直到第一个空字符(以先到者为准),在分配的空间中,就像调用 一样malloc。如果 by 指向的数组的s第一个字符中不包含 null size,则将 null 附加到数组的副本中。

返回
strndup函数返回一个指向所创建字符串的第一个字符的指针。返回的指针可以传递给free. 如果无法分配空间,则该strndup函数返回空指针。

strnlen为什么不考虑包含POSIX-2008 函数?

#include …
Run Code Online (Sandbox Code Playgroud)

c c-strings language-lawyer c23

4
推荐指数
1
解决办法
377
查看次数

为什么只有第一个printf输出到终端?

我有一个 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)

但我不明白为什么

c

4
推荐指数
1
解决办法
108
查看次数

该 C 代码的输出与编译器相关吗?

#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 编译器中运行了这段代码,所有编译器都给出了相同的输出。

c sequence-points

4
推荐指数
1
解决办法
121
查看次数